Perché lm e biglm in R forniscono valori p diversi per gli stessi dati?


12

Ecco un piccolo esempio:

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

Ora con il 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

Ora, prova la stessa cosa con biglmdal biglmpacchetto:

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

Nota che abbiamo bisogno di printe digitsper vedere il valore p. I coefficienti e gli errori standard sono gli stessi, ma i valori di p sono molto diversi. Perché è così?


5
+1 Suggerimento: confronta pt(-3.491, 2)*2ad pnorm(-3.491)*2esempio.
whuber

@whuber Grazie. Quindi essenzialmente si tratta di una distribuzione t rispetto al normale problema di distribuzione. L'idea che la distribuzione normale abbia più senso per i set di dati di grandi dimensioni tipici di biglm?
John Paul,

1
Penso che l'idea sia che normale non sia così diverso da t con un alto valore di . Prova l'esempio dal primo commento, ma modifica pt (-3.491, 2) * 2 in pt (-3.491, 2e3) * 2. ν
Andrey Kolyadin,

Risposte:


9

Per vedere quali valori p sono corretti (se uno dei due), ripetiamo il calcolo per i dati simulati in cui l'ipotesi nulla è vera. Nella presente impostazione, il calcolo è un minimo quadrato adatto ai dati (x, y) e l'ipotesi nulla è che la pendenza sia zero. Nella domanda ci sono quattro valori x 1,2,3,4 e l'errore stimato è di circa 0,7, quindi includiamolo nella simulazione.

Ecco la configurazione, scritta per essere comprensibile a tutti, anche a chi non ha familiarità R.

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

La simulazione genera errori indipendenti, li aggiunge a y.expected, invoca lmper adattarsi e summaryper calcolare i valori p. Sebbene ciò sia inefficiente, sta testando il codice effettivo utilizzato. Possiamo ancora fare migliaia di iterazioni in un secondo:

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)

I valori p calcolati correttamente agiranno come numeri casuali uniformi tra e101 quando l'ipotesi nulla è vera. Un istogramma di questi valori p ci consentirà di verificarlo visivamente - sembra approssimativamente orizzontale - e un test chi-quadrato di uniformità consentirà una valutazione più formale. Ecco l'istogramma:

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

figura

e, per coloro che potrebbero immaginare che questo non sia sufficientemente uniforme, ecco il test chi-quadrato:

chisq.test(h$counts)

Quadrato X = 13,042, df = 18, valore p = 0,7891

Il grande valore p in questo test mostra che questi risultati sono coerenti con l'uniformità attesa. In altre parole, lmè corretto.

Da dove vengono quindi le differenze nei valori p? Controlliamo le formule probabili che potrebbero essere invocate per calcolare un valore p. In ogni caso la statistica del test sarà

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

uguale alla discrepanza tra il coefficiente stimato e l'ipotizzato (e valore corretto) , espresso come multiplo dell'errore standard della stima del coefficiente. Nella domanda questi valori sono ß=0β^β=0

|t|=|3.050,87,378 mila|=3.491

per la stima dell'intercettazione e

|t|=|-1.380,31,906 mila|=4.321

per la stima della pendenza. Normalmente questi sarebbero confrontati con la distribuzione Student il cui parametro gradi di libertà è (la quantità di dati) meno (il numero di coefficienti stimati). Calcoliamolo per l'intercettazione:t42

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

[1] 0.0732

(Questo calcolo moltiplica la probabilità Studente della coda sinistra per perché si tratta di un test di rispetto all'alternativa bilaterale ) Concorda con l' output.tH 0 : β = 0 H A : β 02H0:β=0HUN:β0lm

Un calcolo alternativo userebbe la distribuzione normale standard per approssimare la distribuzione Student . Vediamo cosa produce:t

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

[1] 0.000482

Abbastanza sicuro: biglmpresuppone che la distribuzione nulla della statistica sia normale. Quanto di un errore è questo? Rieseguire la simulazione precedente usando al posto di fornisce questo istogramma di valori p:tbiglmlm

figura 2

Quasi il 18% di questi valori p è inferiore a , una soglia standard di "significatività". Questo è un errore enorme.0.05


Alcune lezioni che possiamo imparare da questa piccola indagine sono:

  1. Non utilizzare approssimazioni derivate da analisi asintotiche (come la distribuzione normale standard) con piccoli set di dati.

  2. Conosci il tuo software.


2
Buona risposta (+1). Ma stai prendendo che non è proprio un big data ... Penso che l'autore del pacchetto abbia ignorato il piccolo caso a favore del tipico caso dei big data. Vale la pena sottolineare, tuttavia, nell'aiuto per evitare queste confusioni. nn=4n
epsilone,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.