Ik heb een voorbeeldgegevensset met 31 waarden. Ik heb een tweezijdige t-test uitgevoerd met R om te testen of het ware gemiddelde gelijk is aan 10:
t.test(x=data, mu=10, conf.level=0.95)
Uitvoer:
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 probeer ik “hetzelfde handmatig te doen:
t.value = (mean(data) - 10) / (sd(data) / sqrt(length(data))) p.value = dt(t.value, df=length(lengths-1))
De t-waarde berekend met deze methode is hetzelfde als uitvoer door de functie t-test R. De p-waarde komt echter uit op 3.025803e-12.
Enig idee wat ik verkeerd doe?
Bedankt!
EDIT
Hier is de volledige R-code , inclusief mijn 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)
Antwoord
Gebruik pt
en maak het tweezijdig.
> 2*pt(11.244, 30, lower=FALSE) [1] 2.785806e-12
Reacties
- I denk dat er een detail ontbreekt: wanneer gebruik je lower = F? – Zie mijn vraag hier: stats.stackexchange.com/questions/133091/…
- De waarde moet positief zijn, dus als u deze gebruikt met een variabele die negatief kan zijn, plaatst u
abs
. - Voor een tweezijdige test ' zoeken naar de kans dat de waarde kleiner is dan -11,244 of groter dan +11,244. lower = F vertelt R om de kans te berekenen dat de waarde groter is dan de eerste parameter. Anders geeft het u de kans dat de waarde kleiner is dan de eerste parameter. Als zodanig zou je ook 2 * pt (-11.244, 30) kunnen doen. Persoonlijk doe ik meestal 2 * pt (-abs (q), df = n-1) omdat R standaard lager = T is.
Antwoord
Ik heb dit gepost als een opmerking, maar toen ik wat meer wilde toevoegen tijdens het bewerken, werd het te lang, dus heb ik het hierheen verplaatst.
Bewerken : uw teststatistiek en df zijn correct. Het andere antwoord wijst op het probleem met de berekening van het staartgebied in de oproep naar pt()
, en de verdubbeling voor twee-staarten, die uw verschil oplost. Desalniettemin verlaat ik mijn eerdere discussie / opmerking omdat het relevante punten meer in het algemeen maakt over p-waarden in extreme staarten:
Het is mogelijk dat je niets verkeerd doet en toch een verschil krijgt, maar als je een reproduceerbaar voorbeeld post, is het misschien mogelijk om verder te onderzoeken of je een fout hebt (zeg in de df).
Deze dingen worden berekend op basis van benaderingen die misschien niet bijzonder nauwkeurig zijn in de zeer extreme staart
Als de twee dingen geen identieke benaderingen gebruiken, zijn ze het misschien niet helemaal met elkaar eens, maar dat gebrek aan overeenstemming zou er niet toe moeten doen (aangezien het exacte achtergebied zo ver een zinvol getal is, zouden de vereiste veronderstellingen moeten vasthouden aan een verbazingwekkende mate van nauwkeurigheid). Heb je echt exacte normaliteit, exacte onafhankelijkheid, precies constante variantie?
Je moet niet per se grote nauwkeurigheid verwachten als de cijfers toch niets betekenen. In hoeverre maakt het uit of de berekende geschatte p-waarde $ 2 \ maal 10 ^ {- 12} $ of $ 3 \ maal 10 ^ {- 12} $ is? Geen van beide cijfers meet de werkelijke p-waarde van uw werkelijke situatie. Zelfs als een van de cijfers de echte p-waarde van uw werkelijke situatie vertegenwoordigde, als deze eenmaal onder de $ 0,0001 $ ligt, waarom zou het u dan schelen wat die waarde eigenlijk was?
Answer
De beste manier om het handmatig te berekenen is:
t.value = (mean(data) - 10) / (sd(data) / sqrt(length(data))) p.value = 2*pt(-abs(t.value), df=length(data)-1)
Je hebt de abs () functie omdat je anders het risico loopt p-waarden groter te krijgen dan $ 1 $ (als het gemiddelde van de gegevens groter is dan het gegeven gemiddelde)!
Antwoord
Ik vind het antwoord dat @Aaron geeft erg leuk, samen met de abs
opmerkingen. Ik vind een handige bevestiging om
pt(1.96, 1000000, lower.tail = F) * 2
uit te voeren, wat 0.04999607
oplevert.
Hier gebruiken we de bekende eigenschap dat 95% van het oppervlak onder de normale verdeling voorkomt bij ~ 1,96 standaarddeviaties, dus de output van ~ 0,05 geeft onze p-waarde. Ik gebruikte 1000000 sinds wanneer N enorm is, is de t-distributie bijna hetzelfde als de normale distributie. Dit gaf me troost in de oplossing van @Aaron.