随机前沿模型里最有名的一个坑:检验「有没有无效率项」的似然比统计量,在原假设下并不服从标准卡方。frontier 包的 lrtest.frontier 函数把这件事写在文档里——把一个用极大似然估计的前沿模型和一个「没有无效率项」的模型比,统计量渐近服从混合卡方,引的是 Coelli (1995) 那篇蒙特卡洛。文档同时给了另一条路:两个都用极大似然估计的前沿模型互相比,统计量渐近服从自由度等于约束个数的卡方。
一个函数,两种比较,两种分布,这是这份官方文档最值得先读的地方。
函数的两种调用
lrtest.frontier 是 lmtest 包 lrtest 的 S3 方法,签名很短:lrtest( object, ... ),object 是 class 为 frontier 的拟合对象,... 是另外几个 frontier 对象。
- 只传一个对象:拿它和「没有无效率项、用 OLS 估计」的对应模型比。文档原话是 it compares the fitted model to a corresponding model without inefficiency (i.
e. estimated by OLS)。
- 传多个对象:把第一个依次和后面每一个比,即 it consecutively compares the fitted model object object with the models passed in ...。
统计量的写法是 2 ×(无约束模型的对数似然 受约束模型的对数似然):2 * ( logLik( mu ) - logLik( mr ) ),mu 是无约束、mr 是受约束。
两种比较,两种原假设分布
| 比较方式 | 原假设下的渐近分布 | 文档依据 |
| 极大似然前沿模型 vs OLS(无无效率项) | 混合卡方 | Coelli (1995) |
| 两个极大似然前沿模型互比 | 卡方,自由度=约束个数 j | 文档 Details 段 |
第一种比较对应的是「有没有无效率」这个边界检验:受约束模型里无效率项的方差被压到 0,参数落在参数空间边界上,所以分布不是普通卡方。第二种比较对应的是模型设定之争——分布形状、时间效应这类约束,参数不在边界上,用普通卡方。
文档自带的例子:菲律宾水稻面板
示例数据是 riceProdPhil,Tarlac 地区 43 个稻农 1990 至 1997 年的面板,共 17 个变量:产量 PROD、种植面积 AREA、劳动 LABOR、化肥 NPK、其他投入 OTHER,还有价格、户主年龄与教育、家庭规模、成年人数、旱地比例。用 plm 包把它声明成以 FMERCODE 和 YEARDUM 为索引的面板,然后拟合两个模型:
- mu = sfa( log( PROD ) ~ log( AREA ) + log( LABOR ) + log( NPK ),
- truncNorm = TRUE, timeEffect = TRUE, data = riceProdPhil )
- mr = sfa( log( PROD ) ~ log( AREA ) + log( LABOR ) + log( NPK ),
- data = riceProdPhil )
- lrtest( mu, mr )
- lrtest( mu )
- lrtest( mr )
mu 是截断正态、允许时间效应;mr 用默认设置,即半正态、无时间效应。lrtest(mu, mr) 同时检验两个约束(分布从半正态放宽到截断正态要加一个 μ 参数;再加时间效应),所以自由度是 2。后两行是各自和 OLS 比,检验的是「到底要不要无效率项」。
这个例子选得很有针对性:它把「两模型互比」和「与 OLS 比」两种用法放在同一段代码里,读者照抄就能分清哪个 p 值该按哪种分布读。
返回的是一个 anova 对象
文档说返回值 class 为 anova,包含对数似然值、自由度、自由度之差、似然比卡方统计量和对应的 p 值。它复用 lmtest 的 lrtest,所以打印出来是熟悉的方差分析表样式:一行一个模型,最后一行是差值行。
这里有个文档没写透的地方值得留意:Details 段说第一种比较「渐近服从混合卡方」,Value 段只说返回「卡方统计量与对应 p 值」,没有说明 p 值到底按哪种分布算。做边界检验时,如果按普通卡方(自由度
1)取临界值,5% 的门槛是 3.841,判定会偏保守;混合卡方在同样 5% 下的临界值是 2.706(Kodde and Palm, 1986)。换句话说,p 值落在 0.05 到 0.10 之间时,别急着说「不显著」,回去查一遍混合卡方的临界值再下结论。这条不是文档的表述,是这条检验在文献里的通行处理,用在 doc 给出的 mixed chi-square 结论上正好。
两个极大似然模型互比时的另一个注意点
文档说自由度等于约束个数 j,用普通卡方。但如果被检验的约束恰好把参数推到边界——比如把 μ 约束到 0、把无效率方差约束到 0——分布仍然不是标准卡方,这时按 j 查表会偏松。所以第二种比较最稳的用法是检验非边界约束:时间效应在不在、函数形式换不换、分布形状换不换。
拟合函数本身的几个关键开关
lrtest 只是检验,前面那个 sfa() 才是主体。文档里有四个开关决定你比较的是什么:
- truncNorm:TRUE 时无效率项取截断正态,多一个 μ 参数;FALSE 为半正态。文档注明这条只对「误差成分前沿」(ECF)有效。
- timeEffect:FALSE 为默认,效率估计不随时间变;TRUE 允许时间影响效率。文档注明在「效率影响前沿」(EEF)里这个参数会被忽略。
- ineffDecrease:TRUE 表示无效率降低被解释变量(生产函数),FALSE 表示无效率提高它(成本函数)。
- 公式是否分两段:一段式(或 frontier() 的 zNames 为 NULL)估 ECF,对应 Battese and Coelli (1992);两段式(竖线后面写 Z 变量)估 EEF,对应 Battese and Coelli (1995)。返回对象的 modelType 就是 1 和 2 两个值。
muBound 只在 ECF 加截断正态时有用,用来把 μ 限制在正负 muBound 倍的无效率标准差之内;取无穷、0 或负数时不加限制。
两个模型能不能比,先看样本一不一致
似然比检验的前提是两个模型在同一批观测上估计。返回对象里有 validObs 这个字段,专门标记哪些观测真正进入了估计——含 NA、NaN 或无穷值的行会被剔除。如果宽松模型因为多了一个变量而多剔掉几十条观测,两个模型的对数似然就不在同一批样本上算出来,差出来的那部分不能全归给约束,检验结论站不住。
文档没有专门写一条警告,但把 validObs 放进返回值就是在提醒这件事。做法很直接:比较前先取两次估计的 validObs,逐位相与,若长度一致的观测数变少,就回到同一个子样本上重估两个模型,或者把宽松模型里缺值的变量剔掉。日志里若出现「模型比出来了但样本悄悄变了」,多半是这一步没做。
收敛状态与一个容易被忽略的诊断
返回对象里的 code 标明优化为什么停下:1 是相邻两次迭代的对数似然落在容差内;5 是找不到比上一步更大的似然;6 是梯度步搜索失败;10 是达到最大迭代次数。只有 1 是真收敛,5、6、10 都要回头改初值或换设定。
另有一个 olsSkewnessOkay,判断 OLS 残差的偏度是否符合预期。这个诊断在 SFA 里很实用:如果 OLS 残差偏度的方向就不对,前沿模型大概率估不出有意义的无效率项,先看这一项能省下不少时间。
版本、依赖与许可
- 包名 frontier,版本 1.1-8,DESCRIPTION 日期 2020 年 4 月 15 日,CRAN 发布 2020 年 4 月 17 日
- 作者 Tim Coelli 与 Arne Henningsen,维护者 Arne Henningsen
- 依赖 R ≥ 2.15.0、micEcon ≥ 0.6-14、lmtest ≥ 0.9-24;另导入 moments、stats、Formula、miscTools、plm
- 底层是 Tim Coelli 的 FRONTIER 4.1 的 Fortran 源码,文档建议同时读 Front41.pdf
- 许可 GPL 第 2 版及以上
为什么用 R 包而不是 FRONTIER 4.1
项目主页列了几条差别:4.1 只能跑 Windows,R 包跨平台;4.1 要先准备指令文件和数据文件、必要时改设置文件,R 包是直接写公式;估计出来的系数与效率值可以直接进后续计算。更关键的是修了两个 bug——非平衡面板下 4.1 会给未观测到的观测值返回任意数,ECF 配非平衡面板时它还用任意数算对数似然的导数,容易把优化带偏。做非平衡面板的人,这一条足够成为换工具的理由。
────────────────
回帖可见主要参数表、返回对象字段清单、临界值对照与引用格式。
把经管之家装进你常用的 AI 智能体中 一键快捷安装经管之家 MCP/技能,让 AI 帮你查教程、找数据、读论坛帖子。 检索、阅读公开帖子不收费,安装可申请领取:3 通用积分+100 论坛币+3 元论坛资金 说明: AI 算力按所用平台规则计算;附件按原帖条件获取;福利领取条件以活动页面为准。 |


雷达卡


京公网安备 11010802022788号







