缺少标准错误的测试

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 = expbeta_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" 方差估计,我不确定我是否在不发出警告的情况下建议这些方法,但如果没有方差估计,你将无法测试系数根本。