Calcolo manuale del valore P dal valore t nel test t


49

Ho un set di dati di esempio con 31 valori. Ho eseguito un test t a due code usando R per verificare se la media vera è uguale a 10:

t.test(x=data, mu=10, conf.level=0.95)

Produzione:

t = 11.244, df = 30, p-value = 2.786e-12
alternative hypothesis: true mean is not equal to 10 
95 percent confidence interval:
 19.18980 23.26907 
sample estimates:
mean of x 
 21.22944 

Ora sto provando a fare la stessa cosa manualmente:

t.value = (mean(data) - 10) / (sd(data) / sqrt(length(data))) 
p.value = dt(t.value, df=length(lengths-1))

Il valore t calcolato con questo metodo è uguale a quello emesso dalla funzione t-test R. Il valore p, tuttavia, risulta essere 3.025803e-12.

Qualche idea su cosa sto facendo di sbagliato?

Grazie!

MODIFICARE

Ecco il codice R completo, incluso il mio set di dati:

# Raw dataset -- 32 observations
data = c(21.75, 18.0875, 18.75, 23.5, 14.125, 16.75, 11.125, 11.125, 14.875, 15.5, 20.875,
            17.125, 19.075, 25.125, 27.75, 29.825, 17.825, 28.375, 22.625, 28.75, 27, 12.825, 
            26, 32.825, 25.375, 24.825, 25.825, 15.625, 26.825, 24.625, 26.625, 19.625)

# Student t-Test
t.test(x=data, mu=10, conf.level=0.95)

# Manually calculate p-value
t.value = (mean(data) - 10) / (sd(data) / sqrt(length(data)))
p.value = dt(t.value, df=length(data) - 1)

Risposte:


43

Usa pte rendilo a due code.

> 2*pt(11.244, 30, lower=FALSE)
[1] 2.785806e-12

1
Penso che manchi un dettaglio: quando usare lower = F? - Vedi la mia domanda qui: stats.stackexchange.com/questions/133091/…
vonjd

3
Il valore deve essere positivo, quindi se lo usi con una variabile che potrebbe essere negativa, includi abs.
Aaron - Ripristina Monica il

3
Per un test a due code, stai cercando la probabilità che il valore sia inferiore a -11.244 o superiore a +11.244. lower = F dice a R di calcolare la probabilità che il valore sia maggiore del primo parametro. Altrimenti, ti dà la probabilità che il valore sia inferiore al primo parametro. Pertanto, puoi anche fare 2 * pt (-11.244, 30). Personalmente, di solito faccio 2 * pt (-abs (q), df = n-1) come impostazione predefinita R su inferiore = T.
ashic,

9

L'ho pubblicato come commento ma quando volevo aggiungere un po 'di più in modifica, è diventato troppo lungo, quindi l'ho spostato qui.

Modifica : la statistica del test e df sono corretti. L'altra risposta rileva il problema con il calcolo dell'area di coda nella chiamata a pt()e il raddoppio per due code, che risolve la differenza. Tuttavia, lascerò la mia precedente discussione / commento perché rende più rilevanti i punti rilevanti sui valori p in code estreme:

È possibile che tu non stia facendo nulla di male e che tu abbia ancora una differenza, ma se pubblichi un esempio riproducibile potrebbe essere possibile indagare ulteriormente se hai qualche errore (diciamo nel df).

Queste cose sono calcolate da approssimazioni che potrebbero non essere particolarmente precise nella coda molto estrema.

Se le due cose non usano approssimazioni identiche, potrebbero non essere strettamente d'accordo, ma tale mancanza di accordo non dovrebbe importare (per l'esatta area di coda di quel numero così significativo, le ipotesi richieste dovrebbero tenere a livelli sorprendenti di precisione). Hai davvero la normalità esatta, l'indipendenza esatta, la varianza esattamente costante?

2×10-123×10-120.0001


7

Il modo migliore per calcolarlo manualmente è:

t.value = (mean(data) - 10) / (sd(data) / sqrt(length(data))) 
p.value = 2*pt(-abs(t.value), df=length(data)-1)

1


0

Mi piace molto la risposta fornita da @Aaron, insieme ai abscommenti. Trovo che sia utile eseguire una conferma

pt(1.96, 1000000, lower.tail = F) * 2

che cede 0.04999607.

Qui, stiamo usando la proprietà ben nota che il 95% dell'area sotto la distribuzione normale si verifica a ~ 1,96 deviazioni standard, quindi l'output di ~ 0,05 fornisce il nostro valore p. Ho usato 1000000 da quando N è enorme, la distribuzione t è quasi uguale alla distribuzione normale. Eseguire questo mi ha dato conforto nella soluzione di @ Aaron.

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.