Una opción es explotar el hecho de que para cualquier variable aleatoria continua entonces es uniforme (rectangular) en [0, 1]. Luego, una segunda transformación usando un CDF inverso puede producir una variable aleatoria continua con la distribución deseada, aquí no hay nada especial sobre chi cuadrado a normal. @Glen_b tiene más detalles en su respuesta.XFX(X)
Si desea hacer algo extraño y maravilloso, entre esas dos transformaciones puede aplicar una tercera transformación que asigne variables uniformes en [0, 1] a otras variables uniformes en [0, 1]. Por ejemplo, , u para cualquier , o incluso para y para .u ↦ 1 - uu ↦ u + kmodificación1k ∈ Ru ↦ u + 0.5u ∈ [ 0 , 0.5 ]u ↦ 1 - uu ∈ ( 0.5 , 1 ]
Pero si queremos una transformación monótona de a entonces necesitamos que sus correspondientes cuantiles se mapeen entre sí. Los siguientes gráficos con deciles sombreados ilustran el punto; Tenga en cuenta que he tenido que cortar la visualización de la densidad cerca de cero.X∼χ21Y∼ N( 0 , 1 )χ21
Para la transformación monotónicamente creciente, que asigna rojo oscuro a rojo oscuro, etc., usaría . Para la transformación monotónicamente decreciente, que asigna rojo oscuro a azul oscuro, etc., puede usar el mapeo antes de aplicar el CDF inverso, por lo que . ¡Así es como se ve la relación entre e para la transformación creciente, que también da una idea de cómo se agruparon los cuantiles para la distribución de chi-cuadrado en el extremo izquierdo!Y=Φ- 1(Fχ21( X) )u ↦ 1 - uY=Φ- 1( 1 -Fχ21( X) )XY
Si desea salvar la transformación de raíz cuadrada en , una opción es usar una variable aleatoria Rademacher . La distribución de Rademacher es discreta, conX∼χ21W
P(W=−1)=P(W=1)=12
Es esencialmente un Bernoulli con que se ha transformado al estirar por un factor de escala de dos y luego restar uno. Ahora es normal normal - ¡efectivamente estamos decidiendo al azar si tomar la raíz positiva o negativa!p=12WX−−√
Hace trampa un poco ya que es realmente una transformación de no solo. Pero pensé que valía la pena mencionarlo, ya que parece en el espíritu de la pregunta, y un flujo de variables de Rademacher es bastante fácil de generar. Por cierto, y serían otro ejemplo de variables normales no correlacionadas pero dependientes. Aquí hay un gráfico que muestra dónde se asignan los deciles del original ; recuerde que cualquier cosa en el lado derecho de cero es donde y el lado izquierdo es . Observe cómo los valores alrededor de cero se asignan a partir de valores bajos de y las colas (extremos izquierdo y derecho) se asignan a partir de los valores grandes de(W,X)XZWZχ21W=1W=−1XX .
Código para parcelas ( vea también esta publicación de desbordamiento de pila ):
require(ggplot2)
delta <- 0.0001 #smaller for smoother curves but longer plot times
quantiles <- 10 #10 for deciles, 4 for quartiles, do play and have fun!
chisq.df <- data.frame(x = seq(from=0.01, to=5, by=delta)) #avoid near 0 due to spike in pdf
chisq.df$pdf <- dchisq(chisq.df$x, df=1)
chisq.df$qt <- cut(pchisq(chisq.df$x, df=1), breaks=quantiles, labels=F)
ggplot(chisq.df, aes(x=x, y=pdf)) +
geom_area(aes(group=qt, fill=qt), color="black", size = 0.5) +
scale_fill_gradient2(midpoint=median(unique(chisq.df$qt)), guide="none") +
theme_bw() + xlab("x")
z.df <- data.frame(x = seq(from=-3, to=3, by=delta))
z.df$pdf <- dnorm(z.df$x)
z.df$qt <- cut(pnorm(z.df$x),breaks=quantiles,labels=F)
ggplot(z.df, aes(x=x,y=pdf)) +
geom_area(aes(group=qt, fill=qt), color="black", size = 0.5) +
scale_fill_gradient2(midpoint=median(unique(z.df$qt)), guide="none") +
theme_bw() + xlab("y")
#y as function of x
data.df <- data.frame(x=c(seq(from=0, to=6, by=delta)))
data.df$y <- qnorm(pchisq(data.df$x, df=1))
ggplot(data.df, aes(x,y)) + theme_bw() + geom_line()
#because a chi-squared quartile maps to both left and right areas, take care with plotting order
z.df$qt2 <- cut(pchisq(z.df$x^2, df=1), breaks=quantiles, labels=F)
z.df$w <- as.factor(ifelse(z.df$x >= 0, 1, -1))
ggplot(z.df, aes(x=x,y=pdf)) +
geom_area(data=z.df[z.df$x > 0 | z.df$qt2 == 1,], aes(group=qt2, fill=qt2), color="black", size = 0.5) +
geom_area(data=z.df[z.df$x <0 & z.df$qt2 > 1,], aes(group=qt2, fill=qt2), color="black", size = 0.5) +
scale_fill_gradient2(midpoint=median(unique(z.df$qt)), guide="none") +
theme_bw() + xlab("y")