缺少标准错误的测试
test with missing standard errors
当我的预测器完美预测我的因变量时,我如何在 Stata 中进行假设检验?
我想 运行 对我的许多数据子集进行相同的回归。对于每个回归,我想检验 beta_1 = 1/2 的假设。但是,对于某些子集,我有完全共线性,而 Stata 无法计算标准误差。
例如,在下面的例子中,
sysuse auto, clear
gen value = 2*foreign*(price<6165)
gen value2 = 2*foreign*(price>6165)
gen id = 1 + (price<6165)
我得到输出
. reg foreign value value2 weight length, noconstant
Source | SS df MS Number of obs = 74
-------------+------------------------------ F( 4, 70) = .
Model | 22 4 5.5 Prob > F = .
Residual | 0 70 0 R-squared = 1.0000
-------------+------------------------------ Adj R-squared = 1.0000
Total | 22 74 .297297297 Root MSE = 0
------------------------------------------------------------------------------
foreign | Coef. Std. Err. t P>|t| [95% Conf. Interval]
-------------+----------------------------------------------------------------
value | .5 . . . . .
value2 | .5 . . . . .
weight | 3.54e-19 . . . . .
length | -6.31e-18 . . . . .
------------------------------------------------------------------------------
和
. test value = .5
( 1) value = .5
F( 1, 70) = .
Prob > F = .
在实际数据中,通常会有更多的变化。所以我可以确定预测器在预测 DV 方面做得很好的情况——但我错过了那些预测完美的情况。有没有办法进行假设检验来捕捉这些案例?
编辑:
最终目标是根据假设检验对子集中的观察结果进行分类。如果我不能以 95% 的置信度拒绝假设,我将观察结果归类为类型 1。下面,两个 组都将归类为类型 1,尽管我只想要第二组。
gen type = .
for values 1/2 {
quietly: reg foreign value value2 weight length if id = `i', noconstant
test value = .5
replace type = 1 if r(p)>.05
}
据我所知,没有任何开箱即用的方法。当然,在这些情况下,您可以自己对其进行编程以获得 p 值的近似值。此处缺少标准误差,因为 x 和 y 之间的关系完全共线。模型中没有噪音,没有任何偏差。
不过有趣的是,无论如何,估计的标准误差在这种情况下是无用的。 test
针对 beta_i = exp
对 beta_i != exp
执行 Wald 检验,而不是 t 检验。
Wald 检验使用回归中的方差-协方差矩阵。要自己查看,请参考方法和公式部分 here 和 运行 以下代码:
(另外,如果您从 gen mpg2 =
和 运行 中删除 -1
,您将看到问题)
sysuse auto, clear
gen mpg2 = mpg * 2.5 - 1
qui reg mpg2 mpg, nocons
* collect matrices to calculate Wald statistic
mat b = e(b) // Vector of Coefficients
mat V = e(V) // Var-Cov matrix
mat R = (1) // for use in Rb-r. This does not == [0,1] because of
the use of the noconstant option in regress
mat r = (2.5) // Value you want to test for equality
mat W = (R*b-r)'*inv(R*V*R')*(R*b-r)
// This is where it breaks for you, because with perfect collinearity, V == 0
reg mpg2 mpg, nocons
test mpg = 2.5
sca F = r(F)
sca list F
mat list W
现在,正如@Brendan Cox 所建议的,您可以简单地使用 r(p)
中返回的缺失值来调整您的 replace
命令。具体取决于您如何使用它。然而,需要注意的是,当一些 x 和 y 之间的关系是 y = 2x
,而你想要 test x = 5
vs test x = 2
,您需要非常小心地解释缺失的 p 值 - 在这两种情况下,它们都被分类为 type == 1
,其中 test x = 2
命令不应导致该结果。
另一种解决方法是在这些情况下简单地设置 p = 0,因为随着线性关系变得接近完美,方差估计将渐近接近 0,因此 Wald 统计量将接近无穷大(驱动 p 下降,其他条件相同)。
在这种情况下,最终但更复杂的解决方法可能是使用手册中的公式手动计算 F 统计量,并将 V 设置为任意但无限小的数字。我在下面包含了执行此操作的代码,但它比简单地发出 test
命令要复杂得多,实际上只是 F 分布的实际 p 值的近似值。
clear *
sysuse auto
gen i = ceil(_n/5)
qui sum i
gen mpg2 = mpg * 2 if i <= 5 // Get different estimation results
replace mpg2 = mpg * 10 if i > 5 // over different subsets of data
gen type = .
local N = _N // use for d.f. calculation later
local iMax = r(max) // use to iterate loop
forvalues i = 1/`iMax' {
qui reg mpg2 mpg if i == `i', nocons
mat b`i' = e(b) // collect returned results for Wald stat
mat V`i' = e(V)
sca cov`i' = V`i'[1,1]
mat R`i' = (1)
mat r`i' = (2) // Value you wish to test against
if (cov`i' == 0) { // set V to be very small if Variance = 0 & calculate Wald
mat V`i' = 1.0e-14
}
mat W`i' = (R`i'*b`i'-r`i')'*inv(R`i'*V`i'*R`i'')*(R`i'*b`i'-r`i')
sca W`i' = W`i'[1,1] // collect Wald statistic into scalar
sca p`i' = Ftail(1,`N'-2, W`i') // pull p-value from F dist
if p`i' > .05 {
replace type = 1 if i == `i'
}
}
另请注意,如果您想测试多个系数,此变通方法将变得稍微复杂一些。
考虑到你是在非常真实的意义上 "making up" 方差估计,我不确定我是否在不发出警告的情况下建议这些方法,但如果没有方差估计,你将无法测试系数根本。
当我的预测器完美预测我的因变量时,我如何在 Stata 中进行假设检验?
我想 运行 对我的许多数据子集进行相同的回归。对于每个回归,我想检验 beta_1 = 1/2 的假设。但是,对于某些子集,我有完全共线性,而 Stata 无法计算标准误差。
例如,在下面的例子中,
sysuse auto, clear
gen value = 2*foreign*(price<6165)
gen value2 = 2*foreign*(price>6165)
gen id = 1 + (price<6165)
我得到输出
. reg foreign value value2 weight length, noconstant
Source | SS df MS Number of obs = 74
-------------+------------------------------ F( 4, 70) = .
Model | 22 4 5.5 Prob > F = .
Residual | 0 70 0 R-squared = 1.0000
-------------+------------------------------ Adj R-squared = 1.0000
Total | 22 74 .297297297 Root MSE = 0
------------------------------------------------------------------------------
foreign | Coef. Std. Err. t P>|t| [95% Conf. Interval]
-------------+----------------------------------------------------------------
value | .5 . . . . .
value2 | .5 . . . . .
weight | 3.54e-19 . . . . .
length | -6.31e-18 . . . . .
------------------------------------------------------------------------------
和
. test value = .5
( 1) value = .5
F( 1, 70) = .
Prob > F = .
在实际数据中,通常会有更多的变化。所以我可以确定预测器在预测 DV 方面做得很好的情况——但我错过了那些预测完美的情况。有没有办法进行假设检验来捕捉这些案例?
编辑: 最终目标是根据假设检验对子集中的观察结果进行分类。如果我不能以 95% 的置信度拒绝假设,我将观察结果归类为类型 1。下面,两个 组都将归类为类型 1,尽管我只想要第二组。
gen type = .
for values 1/2 {
quietly: reg foreign value value2 weight length if id = `i', noconstant
test value = .5
replace type = 1 if r(p)>.05
}
据我所知,没有任何开箱即用的方法。当然,在这些情况下,您可以自己对其进行编程以获得 p 值的近似值。此处缺少标准误差,因为 x 和 y 之间的关系完全共线。模型中没有噪音,没有任何偏差。
不过有趣的是,无论如何,估计的标准误差在这种情况下是无用的。 test
针对 beta_i = exp
对 beta_i != exp
执行 Wald 检验,而不是 t 检验。
Wald 检验使用回归中的方差-协方差矩阵。要自己查看,请参考方法和公式部分 here 和 运行 以下代码:
(另外,如果您从 gen mpg2 =
和 运行 中删除 -1
,您将看到问题)
sysuse auto, clear
gen mpg2 = mpg * 2.5 - 1
qui reg mpg2 mpg, nocons
* collect matrices to calculate Wald statistic
mat b = e(b) // Vector of Coefficients
mat V = e(V) // Var-Cov matrix
mat R = (1) // for use in Rb-r. This does not == [0,1] because of
the use of the noconstant option in regress
mat r = (2.5) // Value you want to test for equality
mat W = (R*b-r)'*inv(R*V*R')*(R*b-r)
// This is where it breaks for you, because with perfect collinearity, V == 0
reg mpg2 mpg, nocons
test mpg = 2.5
sca F = r(F)
sca list F
mat list W
现在,正如@Brendan Cox 所建议的,您可以简单地使用 r(p)
中返回的缺失值来调整您的 replace
命令。具体取决于您如何使用它。然而,需要注意的是,当一些 x 和 y 之间的关系是 y = 2x
,而你想要 test x = 5
vs test x = 2
,您需要非常小心地解释缺失的 p 值 - 在这两种情况下,它们都被分类为 type == 1
,其中 test x = 2
命令不应导致该结果。
另一种解决方法是在这些情况下简单地设置 p = 0,因为随着线性关系变得接近完美,方差估计将渐近接近 0,因此 Wald 统计量将接近无穷大(驱动 p 下降,其他条件相同)。
在这种情况下,最终但更复杂的解决方法可能是使用手册中的公式手动计算 F 统计量,并将 V 设置为任意但无限小的数字。我在下面包含了执行此操作的代码,但它比简单地发出 test
命令要复杂得多,实际上只是 F 分布的实际 p 值的近似值。
clear *
sysuse auto
gen i = ceil(_n/5)
qui sum i
gen mpg2 = mpg * 2 if i <= 5 // Get different estimation results
replace mpg2 = mpg * 10 if i > 5 // over different subsets of data
gen type = .
local N = _N // use for d.f. calculation later
local iMax = r(max) // use to iterate loop
forvalues i = 1/`iMax' {
qui reg mpg2 mpg if i == `i', nocons
mat b`i' = e(b) // collect returned results for Wald stat
mat V`i' = e(V)
sca cov`i' = V`i'[1,1]
mat R`i' = (1)
mat r`i' = (2) // Value you wish to test against
if (cov`i' == 0) { // set V to be very small if Variance = 0 & calculate Wald
mat V`i' = 1.0e-14
}
mat W`i' = (R`i'*b`i'-r`i')'*inv(R`i'*V`i'*R`i'')*(R`i'*b`i'-r`i')
sca W`i' = W`i'[1,1] // collect Wald statistic into scalar
sca p`i' = Ftail(1,`N'-2, W`i') // pull p-value from F dist
if p`i' > .05 {
replace type = 1 if i == `i'
}
}
另请注意,如果您想测试多个系数,此变通方法将变得稍微复杂一些。
考虑到你是在非常真实的意义上 "making up" 方差估计,我不确定我是否在不发出警告的情况下建议这些方法,但如果没有方差估计,你将无法测试系数根本。