Come eseguire test t a due campioni in R immettendo statistiche campione anziché dati grezzi?


32

Diciamo che abbiamo le statistiche riportate di seguito

gender mean sd n
f 1.666667 0.5773503 3
m 4.500000 0.5773503 4

Come si esegue un test t a due campioni (per vedere se c'è una differenza significativa tra i mezzi di uomini e donne in alcune variabili) usando statistiche come questa piuttosto che dati reali?

Non riuscivo a trovare da nessuna parte su Internet come farlo. La maggior parte dei tutorial e persino il manuale affrontano il test solo con il set di dati effettivo.


2
Questo articolo di Wikipedia più la pagina di aiuto per le funzioni di distribuzione t di R (ottenuto da ?pt) - vedi in particolare pt()- hanno tutte le informazioni di cui avresti bisogno per farlo da solo. E imparerai molto su statistiche e R se lo fai.
Josh O'Brien,

2
Ci sono già buone risposte qui, ed effettivamente è sia molto facile (e buona pratica) scrivere una funzione per questo da soli; tuttavia, aggiungerò che potresti dare un'occhiata alla tsum.testfunzione nel pacchetto BSDA , che implementa un test t (due campioni; Welch o uguale varianza e anche un campione) dai dati di riepilogo che fornisci. Funziona sostanzialmente come il test t in Vanilla R ma sulle informazioni di riepilogo.
Glen_b -Reinstate Monica,

1
Ad essere sincero, quando stavo imparando a programmare il mio insegnante diceva sempre "non reinventare la ruota". Pertanto, la funzione più logica sarebbe tsum.test()quella BSDA libraryindicata da @Nick Cox. Fa esattamente la stessa cosa di quanto scritto da @macro in righe di codice. Se la domanda si ponesse, qual è la comprensione del calcolo di base per il calcolo della statistica del test t in R, allora Marco sarebbe più appropriato una risposta. Si prega di notare che non sto cercando di offendere nessuno, sto solo affermando la mia opinione personale relativa al mio background professionale. E @marco che è un po 'di codice pulito :)
tcratius

Risposte:


37

Puoi scrivere la tua funzione in base a ciò che sappiamo sulla meccanica del test due campionit . Ad esempio, questo farà il lavoro:

# m1, m2: the sample means
# s1, s2: the sample standard deviations
# n1, n2: the same sizes
# m0: the null value for the difference in means to be tested for. Default is 0. 
# equal.variance: whether or not to assume equal variance. Default is FALSE. 
t.test2 <- function(m1,m2,s1,s2,n1,n2,m0=0,equal.variance=FALSE)
{
    if( equal.variance==FALSE ) 
    {
        se <- sqrt( (s1^2/n1) + (s2^2/n2) )
        # welch-satterthwaite df
        df <- ( (s1^2/n1 + s2^2/n2)^2 )/( (s1^2/n1)^2/(n1-1) + (s2^2/n2)^2/(n2-1) )
    } else
    {
        # pooled standard deviation, scaled by the sample sizes
        se <- sqrt( (1/n1 + 1/n2) * ((n1-1)*s1^2 + (n2-1)*s2^2)/(n1+n2-2) ) 
        df <- n1+n2-2
    }      
    t <- (m1-m2-m0)/se 
    dat <- c(m1-m2, se, t, 2*pt(-abs(t),df))    
    names(dat) <- c("Difference of means", "Std Error", "t", "p-value")
    return(dat) 
}
x1 = rnorm(100)
x2 = rnorm(200) 
# you'll find this output agrees with that of t.test when you input x1,x2
t.test2( mean(x1), mean(x2), sd(x1), sd(x2), 100, 200)
Difference of means       Std Error               t         p-value 
        -0.05692268      0.12192273     -0.46687500      0.64113442 

1
La mia modifica a confronto è t.teststata respinta, quindi ecco un codice per confermare:(tt2 <- t.test2(mean(x1), mean(x2), sd(x1), sd(x2), length(x1), length(x2))); (tt <- t.test(x1, x2)); tt$statistic == tt2[["t"]]; tt$p.value == tt2[["p-value"]]
Max Ghenis,

20

t=(meanfmeanm)expected differenceSE  SE=sdf2nf+sdm2nm  where,    df=nm+nf2

La differenza prevista è probabilmente zero.

Se si desidera il valore p, utilizzare semplicemente la pt()funzione:

pt(t, df)

Quindi, mettendo insieme il codice:

> p = pt((((1.666667 - 4.500000) - 0)/sqrt(0.5773503/3 + 0.5773503/4)), (3 + 4 - 2))
> p
[1] 0.002272053

Ciò presuppone varianze uguali, il che è ovvio perché hanno la stessa deviazione standard.


Rp

La libertà di laurea fornita in questo caso non è corretta! Si utilizza una varianza senza pool che presuppone varianze disuguali. Pertanto, il grado di libertà è più preciso usando l'approssimazione di Scatterwaite.
lzstat,

7

È possibile eseguire i calcoli in base alla formula nel libro (sulla pagina Web) oppure è possibile generare dati casuali con le proprietà dichiarate (vedere la mvrnormfunzione nel MASSpacchetto) e utilizzare la t.testfunzione regolare sui dati simulati.


Quando dici "puoi generare dati casuali con le proprietà dichiarate", intendi simulare i dati con media della popolazione e deviazione standard pari ai valori del campione o simulare sotto il vincolo che la media del campione e la deviazione standard sono uguali a una pre valore specificato?
Macro

2
Volete che i dati simulati abbiano esattamente la stessa media (s) e var (s) come indicato nel problema. Un modo per farlo (ce ne sono molti altri) è usare la mvrnormfunzione nel MASSpacchetto (è necessario impostare l'argomento empirico su TRUE).
Greg Snow,

2

La domanda si pone su R, ma il problema può sorgere con qualsiasi altro software statistico. Stata, ad esempio, ha vari cosiddetti comandi immediati, che consentono calcoli da sole statistiche riassuntive. Vedere http://www.stata.com/manuals13/rttest.pdf per il caso particolare del ttesticomando, che si applica qui.

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.