Manuell beräkning av P-värde från t-värde i t-test

Jag har ett provdataset med 31 värden. Jag körde ett tvåsidigt t-test med R för att testa om det sanna medelvärdet är lika med 10:

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

Output:

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 

Nu försöker jag göra samma sak manuellt:

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

T-värdet beräknat med hjälp av detta metoden är densamma som utdata från t-test R.-funktionen. P-värdet blir dock 3.025803e-12.

Några idéer vad jag gör fel?

Tack!

EDIT

Här är hela R-koden , inklusive min dataset:

# 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) 

Svar

Använd pt och gör det tvåsidigt.

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

Kommentarer

  • I tror att det saknas en detalj: När ska man använda lägre = F? – Se min fråga här: stats.stackexchange.com/questions/133091/…
  • Värdet måste vara positivt, så om du använder detta med en variabel som kan vara negativ, slå in abs.
  • För ett tvåsidig test, du ' letar efter sannolikheten att värdet är mindre än -11,244 eller mer än +11,244. lägre = F säger till R att beräkna sannolikheten för att värdet är mer än den första parametern. Annars ger det dig sannolikheten för att värdet är mindre än den första parametern. Som sådan kan du också göra 2 * pt (-11.244, 30). Personligen gör jag vanligtvis 2 * pt (-abs (q), df = n-1) eftersom R som standard är lägre = T.

Svar

Jag postade detta som en kommentar men när jag ville lägga till lite mer i redigeringen, blev det för långt så jag har flyttat det här.

Redigera : Din teststatistik och df är korrekta. Det andra svaret noterar problemet med beräkningen av svansområdet i samtalet till pt() och fördubbling för två-svansar, vilket löser din skillnad. Ändå lämnar jag min tidigare diskussion / kommentar eftersom det ger relevanta punkter mer generellt om p-värden i extrema svansar:

Det är möjligt att du inte gör något fel och ändå får skillnad, men om du lägger upp ett reproducerbart exempel kan det vara möjligt att undersöka om du har något fel (säg i df).

Dessa saker beräknas från approximationer som kanske inte är särskilt exakta i den mycket extrema svansen .

Om de två sakerna inte använder identiska approximationer kanske de inte överensstämmer nära, men att bristen på överenskommelse inte skulle betyda (för det exakta svansområdet så långt att vara meningsfullt skulle de antaganden som krävs måste hålla förbluffande grader av noggrannhet). Har du verkligen exakt normalitet, exakt oberoende, exakt konstant varians?

Du borde inte nödvändigtvis förvänta dig stor noggrannhet där siffrorna inte kommer att betyda någonting i alla fall. I vilken utsträckning spelar det någon roll om det beräknade ungefärliga p-värdet är $ 2 \ gånger 10 ^ {- 12} $ eller $ 3 \ gånger 10 ^ {- 12} $? Inget nummer mäter det faktiska p-värdet för din sanna situation. Även om ett av siffrorna representerade det verkliga p-värdet för din sanna situation, när det var ungefär $ 0,0001 $, varför skulle du bry dig om vilket värde egentligen var?

Svar

Det bästa sättet att beräkna det manuellt är:

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

Du behöver abs () -funktion eftersom du annars riskerar att få p-värden större än $ 1 $ (när medelvärdet av data är större än det givna medelvärdet)!

Svar

Jag gillar verkligen svaret som @Aaron gav, tillsammans med abs kommentarer. Jag tycker att en praktisk bekräftelse är att köra

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

vilket ger 0.04999607.

Här använder vi den välkända egenskapen att 95% av arean under normalfördelningen sker vid ~ 1,96 standardavvikelser, så utdata på ~ 0,05 ger vårt p-värde. Jag använde 1000000 sedan när N är enorm är t-fördelningen nästan densamma som normalfördelningen. Att köra detta gav mig tröst i @ Arons lösning.

Lämna ett svar

Din e-postadress kommer inte publiceras. Obligatoriska fält är märkta *