Estos dos métodos para calcular el valor p deberían 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)
El problema con el segundo método es que existe el riesgo de obtener valores mayores que (de hecho, hasta ):
2*pt((1.5-1.2)*sqrt(100)/.5,df=100-1)
[1] 2
Por supuesto, esto puede remediarse
2*pt((1.5-1.2)*sqrt(100)/.5,df=100-1,lower=F)
[1] 3.245916e-08
Mi pregunta
Obviamente, el algoritmo de la función t-test es lo suficientemente inteligente como para distinguir estos dos casos (si la media de la muestra es mayor o menor que la media dada). ¿Existe un método fácil para replicar manualmente el cálculo del valor p como lo hace la función t-test?
Mi solución en este momento es una declaración if que verifica si el valor resultante es mayor que y, en este caso, vuelve a hacer el mismo cálculo con la opción menor = F, pero tal vez haya una mejor manera.
getAnywhere(t.test.default)
. Lo encontraráspval <- 2 * pt(-abs(tstat), df)
allí.Respuestas:
Puede utilizar
abs
en el numerador (por lo que siempre es> 0) y mantener ellower.tail=FALSE
.fuente
Glen_b tiene toda la razón sobre el
abs
, sin embargo, he encontrado que en ciertos conjuntos de datos los valores requerirían-abs
tener el efecto deseado. No puedo explicar por qué, pero dejaré esta línea de código aquí, en caso de que alguien que tenga un problema similar encuentre este hilo.Respuesta ampliada a petición de mdewey.
fuente