Como executar testes t de duas amostras no R inserindo estatísticas de amostra em vez dos dados brutos?

32

Digamos que temos as estatísticas abaixo

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

Como você executa um teste t de duas amostras (para ver se há uma diferença significativa entre as médias de homens e mulheres em alguma variável) usando estatísticas como essa em vez de dados reais?

Não consegui encontrar em nenhum lugar da internet como fazer isso. A maioria dos tutoriais e até o manual lidam com o teste apenas com o conjunto de dados real.

Alby
fonte
2
Este artigo da Wikipedia, mais a página de ajuda para as funções de distribuição t de R (recebidas ?pt) - veja especialmente pt()- têm todas as informações necessárias para você fazer isso sozinho. E você aprenderá muito sobre estatísticas e R se fizer isso.
21712 Josh O'Brien
2
Já existem boas respostas e, de fato, é muito fácil (e boa prática) escrever uma função para você; no entanto, acrescentarei que você pode dar uma olhada na tsum.testfunção no pacote BSDA , que implementa um teste t (duas amostras; Welch ou variação igual e também uma amostra) a partir dos dados resumidos que você fornece. Basicamente, funciona como o teste t no vanilla R, mas nas informações resumidas.
Glen_b -Reinstala Monica
11
Para ser sincero, quando eu estava aprendendo a programar, meu professor sempre dizia: "não reinvente a roda". Portanto, a função mais lógica seria tsum.test()a do BSDA librarydeclarado por @Nick Cox. Ele faz exatamente a mesma coisa que o @macro escreveu em linhas de código. Se a pergunta for feita, qual é o entendimento do cálculo de segundo plano para calcular a estatística do teste t em R, então Marco seria uma resposta mais apropriada. Observe que não estou tentando ofender ninguém, apenas afirmando minha opinião pessoal relacionada à minha formação profissional. E @marco que é alguma limpo codificação :)
tcratius

Respostas:

37

Você pode escrever sua própria função com base no que sabemos sobre a mecânica do teste duas amostrast . Por exemplo, isso fará o trabalho:

# 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 
Macro
fonte
11
Meu editar comparação com t.testfoi rejeitado, então aqui está um código para confirmar:(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=(significarf-significarm)-diferença esperadaSE  SE=sdf2nf+sdm2nm  Onde,    df=nm+nf-2

A diferença esperada é provavelmente zero.

Se você deseja o valor p, basta usar a pt()função:

pt(t, df)

Assim, reunindo o código:

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

Isso pressupõe variações iguais, o que é óbvio porque elas têm o mesmo desvio padrão.

- Reinstate Monica
fonte
Rp
A liberdade de grau fornecida neste caso está incorreta! Você usa desvio não agrupado que assume desvios desiguais. Assim, o grau de liberdade é mais preciso usando a Aproximação Scatterwaite.
lzstat 19/10
7

Você pode fazer os cálculos com base na fórmula do livro (na página da web) ou pode gerar dados aleatórios com as propriedades declaradas (consulte a mvrnormfunção no MASSpacote) e usar a t.testfunção regular nos dados simulados.

Greg Snow
fonte
Quando você diz "você pode gerar dados aleatórios com as propriedades declaradas", você quer simular dados com média populacional e desvio padrão iguais aos valores da amostra ou simular sob a restrição de que a média e o desvio padrão da amostra são iguais a um pré- valor especificado?
Macro
2
Você deseja que os dados simulados tenham exatamente as mesmas médias e vars indicadas no problema. Uma maneira de fazer isso (existem muitas outras) é usar a mvrnormfunção no MASSpacote (você precisa definir o argumento empírico como TRUE).
Greg Neve
2

A pergunta é sobre R, mas o problema pode surgir com qualquer outro software estatístico. O Stata, por exemplo, possui vários comandos chamados imediatos, que permitem cálculos apenas de estatísticas resumidas. Consulte http://www.stata.com/manuals13/rttest.pdf para o caso específico do ttesticomando, que se aplica aqui.

Nick Cox
fonte