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


12

这是一个小例子:

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

请注意,我们需要printand digits来查看p值。系数和标准误差相同,但p值却大不相同。为什么会这样呢?


5
+1提示:比较pt(-3.491, 2)*2pnorm(-3.491)*2,例如。
ub

@whuber谢谢。因此,从本质上讲,这是t分布与正态分布的问题。正态分布对于biglm典型的大型数据集是否更有意义?
约翰·保罗

1
我认为想法是正常的与值高的t没有什么不同。从第一个注释尝试示例,但是将pt(-3.491,2)* 2更改为pt(-3.491,2e3)* 2。ν
Andrey Kolyadin'1

Answers:


9

为了查看哪些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)

101当零假设为真时,正确计算的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β^β=0

|t|=|3.050.87378|=3.491

截距估计和

|t|=|1.380.31906|=4.321

用于斜率估计。通常,将这些数据与自由度参数为(数据量)减去(估计的系数数)的Student分布进行比较。让我们为拦截计算一下:4 2t42

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

[1] 0.0732

(此计算将左尾学生概率乘以因为这是针对两边替代项的检验) 输出一致2 H 0β = 0 H Aβ 0t2H0:β=0HA:β0lm

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

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

[1] 0.000482

果然:biglm假设统计量的零分布为标准正态。这有多少错误?使用代替重新运行前面的仿真,得到以下p值直方图:tbiglmlm

图2

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


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

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

  2. 了解您的软件。


2
好答案(+1)。但是您使用的并不是真正的大数据...我认为程序包的作者忽略了小情况,转而使用典型的大数据情况。但是,值得指出的是,在避免这些混乱的帮助中。nn=4n
epsilone
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.