如何用回归系数的子集代替所有系数创建拟合值?
How do I create a fitted value with a subset of regression coefficients in place of all coefficients?
我 运行 一个简单的回归并找到这样的拟合值:
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
-------------------------------------------------------------------------------
出于反事实的目的(在时间序列中尤其重要),我可能想使用 this 回归中的系数子集找到拟合值。例如,我可能想使用 this 回归中的所有系数找到拟合值,但 mpg
和 foreign
之间的交互系数除外,即 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
这不是一个稳健的解决方案,因为它依赖于系数矩阵列名称中 #
的命名约定,如果我想包含一组交互而不包含另一组交互,则会中断。我可以通过手动指定名称为特定回归编写类似这样的代码,但如果我更改回归,则必须手动更改代码。
是否有更强大的方法来做到这一点,例如
predict fitted_price, xb exclude(c.mpg#foreign trunk)
这会为我简化这个过程吗?
编辑 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
我已经提供了 foreign 的主要影响,但在您的示例中被省略了。
我 运行 一个简单的回归并找到这样的拟合值:
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
-------------------------------------------------------------------------------
出于反事实的目的(在时间序列中尤其重要),我可能想使用 this 回归中的系数子集找到拟合值。例如,我可能想使用 this 回归中的所有系数找到拟合值,但 mpg
和 foreign
之间的交互系数除外,即 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
这不是一个稳健的解决方案,因为它依赖于系数矩阵列名称中 #
的命名约定,如果我想包含一组交互而不包含另一组交互,则会中断。我可以通过手动指定名称为特定回归编写类似这样的代码,但如果我更改回归,则必须手动更改代码。
是否有更强大的方法来做到这一点,例如
predict fitted_price, xb exclude(c.mpg#foreign trunk)
这会为我简化这个过程吗?
编辑 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
我已经提供了 foreign 的主要影响,但在您的示例中被省略了。