Si tiene una función de distribución acumulativa , entonces calcular el valor p para la estadística T dada es simplemente 1 - F ( T ) . Esto es sencillo en R. Si, por otro lado, tiene la función de densidad de probabilidad , entonces F ( x ) = ∫ x - ∞ p ( t ) d t . Puede encontrar esta integral analítica o numéricamente. En R esto se verá así:FpT1−F(T)F(x)=∫x−∞p(t)dt
dF <- function(x)dnorm(x)
pF <- function(q)integrate(dF,-Inf,q)$value
> pF(1)
[1] 0.8413448
> pnorm(1)
[1] 0.8413447
Puede sintonizar integrate
para una mejor precisión. Por supuesto, esto puede fallar en casos específicos, cuando la integral no se comporta bien, pero debería funcionar para la mayoría de las funciones de densidad.
Por supuesto, puede pasar parámetros a pF
, si tiene varios valores de parámetros para probar y no desea redefinir dF
cada vez.
dF <- function(x,mean=0,sd=1)dnorm(x,mean=mean,sd=sd)
pF <- function(q,mean=0,sd=1)integrate(dF,-Inf,q,mean=mean,sd=sd)$value
> pF(1,1,1)
[1] 0.5
> pnorm(1,1,1)
[1] 0.5
Por supuesto, también puede usar los métodos de Monte-Carlo como detalla @suncoolsu, este sería solo otro método numérico para la integración.
dF
. Es decir,dF
debe devolver el valor de la función de densidad en un argumento dado.Sí, es posible utilizar cualquier distribución arbitraria para obtener un valor p para cualquier estadística . Teórica y prácticamente puede calcular el valor p (unilateral) mediante esta fórmula.
La única suposición que está haciendo aquí es: conoce la distribución nula de T (que puede no estar en los formatos estándar de generador de números aleatorios R). Eso es todo, siempre que conozca la distribución nula, se puede calcular el valor p.
fuente