为什么 R 中的 lm 和 biglm 为相同的数据给出不同的 p 值?

机器算法验证 r 回归 p 值 线性模型
2022-03-25 07:48:56

这是一个小例子:

MyDf<-data.frame(x=c(1,2,3,4), y=c(1.2, .7, -.5, -3))

现在有了base::lm

> lm(y~x, data=MyDf) %>% summary

Call:
lm(formula = y ~ x, data = MyDf)

Residuals:
    1     2     3     4 
-0.47  0.41  0.59 -0.53 

Coefficients:
            Estimate Std. Error t value Pr(>|t|)  
(Intercept)   3.0500     0.8738   3.491   0.0732 .
x            -1.3800     0.3191  -4.325   0.0495 *
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 0.7134 on 2 degrees of freedom
Multiple R-squared:  0.9034,    Adjusted R-squared:  0.8551 
F-statistic: 18.71 on 1 and 2 DF,  p-value: 0.04952

现在,biglmbiglm包中尝试同样的事情:

XX<-biglm(y~x, data=MyDf) 
print(summary(XX), digits=5)

Large data regression model: biglm(y ~ x, data = MyDf)
Sample size =  4 
             Coef     (95%      CI)      SE       p
(Intercept)  3.05  1.30243  4.79757 0.87378 0.00048
x           -1.38 -2.01812 -0.74188 0.31906 0.00002

请注意,我们需要printanddigits来查看 p 值。系数和标准误相同,但 p 值非常不同。为什么会这样?

1个回答

要查看哪些 p 值是正确的(如果有的话),让我们对原假设为真的模拟数据重复计算。在当前设置中,计算是对 (x,y) 数据的最小二乘拟合,零假设是斜率为零。在这个问题中有四个 x 值 1、2、3、4,估计误差在 0.7 左右,所以让我们将其合并到模拟中。

这是设置,编写为每个人都可以理解,即使是那些不熟悉R.

beta <- c(intercept=0, slope=0)
sigma <- 0.7
x <- 1:4
y.expected <-  beta["intercept"] + beta["slope"] * x

模拟生成独立的错误,将它们添加到 中y.expected,调用lm以进行拟合,并summary计算 p 值。尽管这效率低下,但它正在测试使用的实际代码。 我们仍然可以在一秒钟内进行数千次迭代:

n.sim <- 1e3
set.seed(17)
data.simulated <- matrix(rnorm(n.sim*length(y.expected), y.expected, sigma), ncol=n.sim)
slope.p.value <- function(e) coef(summary(lm(y.expected + e ~ x)))["x", "Pr(>|t|)"]
p.values <- apply(data.simulated, 2, slope.p.value)

01当原假设为真时,正确计算的 p 值将像这些 p 值的直方图将使我们能够直观地检查这一点——它看起来是否大致水平——并且均匀性的卡方检验将允许进行更正式的评估。这是直方图:

h <- hist(p.values, breaks=seq(0, 1, length.out=20))

数字

而且,对于那些可能认为这不够统一的人,这里是卡方检验:

chisq.test(h$counts)

X 平方 = 13.042,df = 18,p 值 = 0.7891

此测试中的大 p 值表明这些结果与预期的均匀性一致。换句话说,lm是正确的。

那么,p 值的差异从何而来?让我们检查一下可能被调用来计算 p 值的公式。在任何情况下,测试统计量将是

|t|=|β^0se(β^)|,

等于估计系数与假设(和正确值)之间的差异,表示为系数估计的标准误差的倍数。在问题中,这些值是β^β=0

|t|=|3.050.87378|=3.491

对于截距估计和

|t|=|1.380.31906|=4.321

用于斜率估计。通常,这些将与自由度参数为(数据量)减去(估计系数的数量让我们计算它的截距:t42

pt(-abs(3.05/0.87378), 4-2) * 2

[1] 0.0732

(此计算将左尾 Student概率乘以,因为这是对与两侧替代的测试。) 它与输出一致。t2H0:β=0HA:β0lm

另一种计算方法是使用标准正态分布来近似学生分布。让我们看看它产生了什么:t

pnorm(-abs(3.05/0.87378)) * 2

[1] 0.000482

果然:biglm假设统计量的零分布是标准正态分布。这是多大的错误?使用代替重新运行前面的模拟会给出这个 p 值的直方图:tbiglmlm

图 2

这些 p 值中几乎有 18% 小于,这是“显着性”的标准阈值。这是一个巨大的错误。0.05


我们可以从这个小小的调查中学到的一些教训是:

  1. 不要对小数据集使用从渐近分析(如标准正态分布)得出的近似值。

  2. 了解您的软件。