Une option consiste à exploiter le fait que pour toute variable aléatoire continue alors est uniforme (rectangulaire) sur [0, 1]. Ensuite, une deuxième transformation utilisant un CDF inverse peut produire une variable aléatoire continue avec la distribution souhaitée - rien de spécial à propos du chi au carré ici normal. @Glen_b a plus de détails dans sa réponse.XFX(X)
Si vous voulez faire quelque chose de bizarre et de merveilleux, entre ces deux transformations, vous pouvez appliquer une troisième transformation qui mappe des variables uniformes sur [0, 1] à d'autres variables uniformes sur [0, 1]. Par exemple, , ou pour tout , ou même pour et pour .u↦1−uu↦u+kmod1k∈Ru↦u+0.5u∈[0,0.5]u↦1−uu∈(0.5,1]
Mais si nous voulons une transformation monotone de en alors nous avons besoin que leurs quantiles correspondants soient mappés les uns aux autres. Les graphiques suivants avec déciles ombrés illustrent ce point; notez que j'ai dû couper l'affichage de la densité près de zéro.X∼χ21Y∼N(0,1)χ21
Pour la transformation à augmentation monotone, qui mappe le rouge foncé au rouge foncé et ainsi de suite, vous utiliseriez . Pour la transformation décroissante monotone, qui mappe le rouge foncé au bleu foncé et ainsi de suite, vous pouvez utiliser le mappage avant d'appliquer le CDF inverse, donc . Voici à quoi ressemble la relation entre et pour la transformation croissante, ce qui donne également un indice sur la façon dont les quantiles pour la distribution du chi carré étaient à l'extrême gauche!Y=Φ−1(Fχ21(X))u↦1−uY=Φ−1(1−Fχ21(X))XY
Si vous voulez récupérer la racine carrée transformée , une option est d'utiliser une variable aléatoire Rademacher . La distribution de Rademacher est discrète, avecX∼χ21W
P(W=−1)=P(W=1)=12
C'est essentiellement un Bernoulli avec qui a été transformé par étirement d'un facteur d'échelle de deux puis soustraction de un. Maintenant, est normal normal - en fait, nous décidons au hasard s'il faut prendre la racine positive ou négative!p=12WX−−√
C'est tricher un peu car c'est vraiment une transformation de pas seul. Mais j'ai pensé qu'il valait la peine d'être mentionné car cela semble dans l'esprit de la question, et un flux de variables Rademacher est assez facile à générer. Soit dit en passant, et seraient un autre exemple de variables normales non corrélées mais dépendantes. Voici un graphique montrant où les déciles du sont mappés; rappelez-vous que tout sur le côté droit de zéro est où et le côté gauche est . Notez comment les valeurs autour de zéro sont mappées à partir des valeurs faibles de et les queues (extrêmes gauche et droite) sont mappées à partir des grandes valeurs de(W,X)XZWZχ21W=1W=−1XX .
Code pour les tracés ( voir aussi ce post Stack Overflow ):
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")