当我的预测器完全预测我的因变量时,如何在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
}
答案 0 :(得分:2)
我无法开箱即用。我知道这一点。当然,您可以自己编程以获得这些情况下p值的近似值。这里缺少标准误差,因为x和y之间的关系是完全共线的。模型中没有噪音,没有任何偏差。
有趣的是,无论如何,估计的标准误差在这种情况下是无用的。 test
针对beta_i = exp
beta_i != exp
执行Wald测试,而不是t测试。
Wald检验使用回归中的方差 - 协方差矩阵。要自己查看,请参阅方法和公式部分here并运行以下代码:
(另外,如果您从-1
移除gen mpg2 =
并运行,则会看到问题)
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 down,所有其他相等)。
在这种情况下,最后一个更复杂的解决办法可能是使用手册中的公式手动计算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'
}
}
另请注意,如果要测试多个系数,此变通方法将变得更加复杂。
我不确定我是否建议采用这些方法,而不是在考虑到你处于非常真实的意义上而发出警告并且#34;组成&#34;方差估计,但没有方差估计,你根本无法测试系数。