我运行一个简单的回归并找到这样的拟合值:
sysuse auto, clear
reg price mpg c.mpg#foreign i.rep78 headroom trunk
predict fitted_price, xb
这给了我这些系数:
-------------------------------------------------------------------------------
price | Coef. Std. Err. t P>|t| [95% Conf. Interval]
--------------+----------------------------------------------------------------
mpg | -306.1891 77.01548 -3.98 0.000 -460.243 -152.1352
|
foreign#c.mpg |
Foreign | 60.58403 37.24129 1.63 0.109 -13.90964 135.0777
|
rep78 |
2 | 999.7779 2150.269 0.46 0.644 -3301.4 5300.956
3 | 1200.741 2001.853 0.60 0.551 -2803.561 5205.043
4 | 1032.778 2070.513 0.50 0.620 -3108.864 5174.42
5 | 2081.128 2200.998 0.95 0.348 -2321.523 6483.779
|
headroom | -611.7201 502.3401 -1.22 0.228 -1616.55 393.1097
trunk | 134.4143 110.8262 1.21 0.230 -87.27118 356.0998
_cons | 10922.46 2803.271 3.90 0.000 5315.082 16529.84
-------------------------------------------------------------------------------
出于反事实的目的(在时间序列中尤其重要),我可能想要使用来自此回归的系数的子集来找到拟合值。例如,我可能想要使用此回归中的所有系数找到拟合值,但mpg
和foreign
之间的相互作用的系数除外{{{} 1}}。 (请注意,这与仅在没有交互的情况下再次运行回归不同,因为这将产生不同的系数)。
截至目前,我这样做:
c.mpg#foreign
这不是一个强大的解决方案,因为它依赖于系数矩阵列名中sysuse auto, clear
reg price mpg c.mpg#foreign i.rep78 headroom trunk
matrix betas = e(b)
local names: colnames betas
foreach name of local names {
if strpos("`name'", "#") > 0 {
scalar define col_idx = colnumb(betas, "`name'")
matrix betas[1, col_idx] = 0
}
}
matrix score fitted_price_no_interact = betas
的命名约定,如果我想包含一组交互但不包含另一组交互,则会分解。我可以通过手动指定名称来为特定的回归编写类似的代码,但如果我更改回归,则必须手动更改代码。
是否有更强大的方法来做到这一点,例如
#
这会为我简化这个过程吗?
答案 0 :(得分:3)
编辑2015-03-29:在一个互动子集上使用原始方法,但保留其他人
原始方法的一大优势是它可以处理任何复杂性的交互。主要缺陷是它不会忽略您希望保留在模型中的交互。但是,如果您使用xi
创建这些内容,#
将不会出现在他们的名字中。
sysuse auto, clear
recode rep78 1 = 2 //combine small categories
xi, prefix("") i.rep78*mpg // mpg*i.rep78 won't work
des _I*
reg price mpg foreign c.mpg#foreign _I* headroom trunk
matrix betas = e(b)
local names: colnames betas
foreach name of local names {
if strpos("`name'", "#") > 0 {
scalar define col_idx = colnumb(betas, "`name'")
matrix betas[1, col_idx] = 0
}
matrix score fit_sans_mpgXforeign = betas
修改2015-03-28
不需要xi
前缀,因此,例如,这适用于Stata 13。
sysuse auto, clear
gen intx = c.mpg#foreign
reg price mpg foreign i.rep78 headroom trunk intx
predict mhat
gen fitted_sans_interaction = mhat -_b[intx]*intx
上一个答案
sysuse auto, clear
xi: gen intx = c.mpg#foreign
reg price mpg foreign i.rep78 headroom trunk intx
predict mhat
gen fitted_sans_interaction = mhat -_b[intx]*intx
甚至
sysuse auto, clear
xi: gen intx = c.mpg#foreign
reg price c.mpg##foreign i.rep78 headroom trunk intx
predict mhat
gen fitted_sans_interaction = mhat -_b[intx]*intx
我提供了外国人的主要影响,在你的例子中省略了。