测试缺少标准错误

时间:2015-09-28 23:57:22

标签: stata

当我的预测器完全预测我的因变量时,如何在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 
}

1 个答案:

答案 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;方差估计,但没有方差估计,你根本无法测试系数。