我无法在 R 中复制 Statamargins
命令的特定用例:
margins var1, over(var2)
我一直在尝试使用margins
R 中的包来这样做。
为了提供一个可重现的示例,我使用了 mtcars 数据集并将其从 R 导出到 Stata,因此我们在两个程序中使用相同的数据集:
代码:
library(foreign)
library(margins)
write.dta(mtcars, “mtcars.dta")
状态码:
use "mtcars.dta", clear
在两个程序中创建示例线性回归模型
状态码:
quietly regress mpg cyl i.am c.wt##c.hp
代码:
x <- lm(mpg ~ cyl + factor(am) + hp * wt, data = mtcars)
两个程序之间的模型输出(未显示)相同
比较模型中每个变量的平均边际效应表
状态代码和输出:
margins, dydx(*)
Average marginal effects Number of obs = 32
Model VCE: OLS
Expression : Linear prediction, predict() dy/dx w.r.t. : cyl 1.am wt hp
------------------------------------------------------------------------------
| Delta-method
| dy/dx Std. Err. t P>|t| [95% Conf. Interval]
-------------+----------------------------------------------------------------
cyl | -.3708001 .5293674 -0.70 0.490 -1.45893 .7173301
1.am | -.0709546 1.374981 -0.05 0.959 -2.897268 2.755359
wt | -3.868994 .9170145 -4.22 0.000 -5.753944 -1.984043
hp | -.0249882 .0120345 -2.08 0.048 -.0497254 -.000251
------------------------------------------------------------------------------
Note: dy/dx for factor levels is the discrete change from the base level.
R代码和输出:
xmarg <- margins(x)
summary(xmarg)
factor AME SE z p lower upper
am1 -0.0710 1.3750 -0.0516 0.9588 -2.7659 2.6240
cyl -0.3708 0.5294 -0.7005 0.4836 -1.4083 0.6667
hp -0.0250 0.0120 -2.0764 0.0379 -0.0486 -0.0014
wt -3.8690 0.9170 -4.2191 0.0000 -5.6663 -2.0717
如您所见,这两个输出非常相似,正如使用 Rmargins
包所期望的那样。
问题 1:对变量值的边际预测
状态代码和输出:
margins, over(cyl)
Predictive margins Number of obs = 32
Model VCE: OLS
Expression : Linear prediction, predict()
over : cyl
------------------------------------------------------------------------------
| Delta-method
| Margin Std. Err. t P>|t| [95% Conf. Interval]
-------------+----------------------------------------------------------------
cyl |
4 | 26.56699 .6390379 41.57 0.000 25.25342 27.88055
6 | 20.04662 .5797511 34.58 0.000 18.85492 21.23831
8 | 15.02406 .5718886 26.27 0.000 13.84853 16.19959
------------------------------------------------------------------------------
R代码和输出:
aggregate(fitted~cyl, data = xmarg, FUN = mean)
cyl fitted
1 4 26.56699
2 6 20.04662
3 8 15.02406
在上面的两个示例中,R 和 Stata 之间的边际预测是相同的。但是,有没有一种方法(没有手动完成)为每个边际预测生成 delta 方法标准误差,就像上面的 Stata 表中所做的那样?
问题 2:特定变量的边际预测:
状态代码和输出:
margins am
Predictive margins Number of obs = 32
Model VCE : OLS
Expression : Linear prediction, predict()
------------------------------------------------------------------------------
| Delta-method
| Margin Std. Err. t P>|t| [95% Conf. Interval]
-------------+----------------------------------------------------------------
am |
0 | 20.11945 .6819407 29.50 0.000 18.7177 21.5212
1 | 20.0485 .9052764 22.15 0.000 18.18767 21.90932
------------------------------------------------------------------------------
R代码和输出:
aggregate(fitted~am, data = xmarg, FUN = mean)
am fitted
1 0 17.14737
2 1 24.39231
在这个例子中,我们试图margins
通过在预测后对数据集进行子集来复制命令中的 Stata 的“marginlist”参数。这似乎不是正确的方法。我们如何从 Stata 复制这些结果?
问题 3:一个变量对另一个变量值的边际预测
复制这个结果是我的主要目标!
状态代码和输出
margins am, over(cyl)
Predictive margins Number of obs = 32
Model VCE : OLS
Expression : Linear prediction, predict()
over : cyl
------------------------------------------------------------------------------
| Delta-method
| Margin Std. Err. t P>|t| [95% Conf. Interval]
-------------+----------------------------------------------------------------
cyl#am |
4 0 | 26.61859 1.246074 21.36 0.000 24.05725 29.17993
4 1 | 26.54763 .7034599 37.74 0.000 25.10165 27.99362
6 0 | 20.07703 .6449805 31.13 0.000 18.75125 21.4028
6 1 | 20.00607 1.144518 17.48 0.000 17.65348 22.35866
8 0 | 15.0342 .6228319 24.14 0.000 13.75395 16.31445
8 1 | 14.96324 1.257922 11.90 0.000 12.37754 17.54894
------------------------------------------------------------------------------
R代码和输出:
aggregate(fitted ~ am + cyl, data = xmarg, FUN = mean)
am cyl fitted
1 0 4 22.83306
2 1 4 27.96721
3 0 6 19.06359
4 1 6 21.35732
5 0 8 15.08720
6 1 8 14.64519
如您所见,点估计值现在大不相同,并且再次没有 SE 表。解决上述问题 1 和问题 2 可能会解决问题 3。