R中marginaleffects::predictions置信区间计算差异问题咨询
模型设定与估计代码
我采用工具变量法估计包含内生变量二次项的回归模型,公式为:
$Y = b_1 \times \text{endogenous} + b_2 \times \text{endogenous}^2 + b_3 \times \text{controls} + \text{error}$
使用fixest包的feols()函数完成模型估计,代码如下:
model <- feols(outcome ~ control1 + control2 + control3 + control4 | fixed_effect1 + fixed_effect2 | endogenous + I(endogenous^2) ~ instrument + I(instrument^2) , data = dataset, se = "cluster", cluster = "cluster_id")
模型估计结果
| 变量 | 估计值 | 标准误 |
|---|---|---|
| fit_endogenous | -0.041626570 | 0.156600333 |
| fit_I(endogenous^2) | 0.037313536 | 0.264656733 |
| control1 | 0.003302789 | 0.001053634 |
| control2 | -0.004176099 | 0.003436881 |
| control3 | 0.000320232 | 0.000164557 |
| control4 | -0.000000270 | 0.000000127 |
问题描述
我关注endogenous(记为X)的边际效应,当X=0时,边际效应的方差应为$\text{Var}(b_1)$,对应的95%置信区间宽度手动计算为:2*1.96*0.156600333=0.6138733
但运行marginaleffects::predictions(model, newdata = datagrid(endogenous = c(0, 1)))得到如下结果:
| endogenous | Estimate | Std. Error | CI 2.5 % | CI 97.5 % |
|---|---|---|---|---|
| 0 | 9.04 | 0.165 | 8.71 | 9.36 |
| 1 | 9.03 | 0.203 | 8.64 | 9.43 |
X=0时置信区间宽度为9.36-8.71=0.65,明显大于手动计算值,想了解差异原因。
原因分析与解决方案
1. 函数用途混淆:预测值vs边际效应的置信区间
你手动计算的是边际效应的置信区间,但marginaleffects::predictions()默认输出的是Y的预测值的置信区间,两者计算逻辑完全不同:
- 边际效应的方差仅与核心解释变量(endogenous及其平方项)的系数方差、协方差相关;
- 预测值的方差则包含所有控制变量系数的方差、固定效应的估计误差,以及模型整体的误差项贡献,范围远大于单个系数的方差。
2. IV模型与聚类标准误的方差传递
你的模型是工具变量估计且使用了聚类标准误:
- IV模型的方差计算会包含第一阶段回归的方差传递,
marginaleffects会完整调用fixest输出的全方差协方差矩阵,包含所有变量系数间的协方差; - 聚类标准误的调整会进一步影响方差估计结果,而你手动计算时仅使用了单个系数的标准误,未考虑这些复杂的方差成分。
3. datagrid默认取值的额外方差贡献
datagrid()默认将控制变量设为均值/中位数等代表性值,这些控制变量的系数本身存在方差,会被纳入预测值的方差计算中,这也是你手动计算时忽略的部分。
正确获取边际效应置信区间的方法
若需计算endogenous的边际效应及其置信区间,应使用marginaleffects::marginaleffects()函数,其计算逻辑与你手动推导一致:
marginaleffects(model, newdata = datagrid(endogenous = c(0, 1)))
该函数会直接计算$\frac{\partial Y}{\partial X} = \hat{b}_1 + 2X\hat{b}_2$的估计值、标准误和置信区间,自动调用模型的方差协方差矩阵计算边际效应的方差:$\text{Var}(\hat{b}_1 + 2X\hat{b}_2) = \text{Var}(\hat{b}_1) + 4X^2\text{Var}(\hat{b}_2) + 4X\text{Cov}(\hat{b}_1, \hat{b}_2)$。
内容的提问来源于stack exchange,提问作者RobertoAS

