Esses dois métodos para calcular o valor-p devem ser equivalentes:
t.test(rats.drug,mu=1.2)$p.value
2*pt((mean(rats.drug)-1.2)*sqrt(n)/sd(rats.drug),df=n-1)
O problema com o segundo método é que existe o risco de obter valores maiores que (na verdade, até ):
2*pt((1.5-1.2)*sqrt(100)/.5,df=100-1)
[1] 2
Obviamente, isso pode ser remediado por
2*pt((1.5-1.2)*sqrt(100)/.5,df=100-1,lower=F)
[1] 3.245916e-08
Minha pergunta
Obviamente, o algoritmo da função de teste t é inteligente o suficiente para distinguir esses dois casos (se a média da amostra é maior ou menor que a média fornecida). Existe um método fácil para replicar manualmente o cálculo do valor p, como é feito pela função de teste t?
Minha solução no momento é uma instrução if que verifica se o valor resultante é maior que e, nesse caso, faz o mesmo cálculo novamente com a opção = F mais baixa, mas talvez haja uma maneira melhor.
getAnywhere(t.test.default)
. Você encontrarápval <- 2 * pt(-abs(tstat), df)
lá.Respostas:
Você pode usar
abs
no numerador (por isso é sempre> 0) e manter olower.tail=FALSE
.fonte
Glen_b está absolutamente certo sobre
abs
, no entanto, descobri que em determinados conjuntos de dados os valores exigiriam-abs
o efeito desejado. Não sou capaz de explicar o porquê, mas deixarei essa linha de código aqui, caso alguém que esteja tendo um problema semelhante encontre esse segmento.Resposta expandida a pedido de mdewey.
fonte