J'ai le jeu de données simple suivant avec deux variables continues; c'est à dire:
d = data.frame(x=runif(100,0,100),y = runif(100,0,100))
plot(d$x,d$y)
abline(lm(y~x,d), col="red")
cor(d$x,d$y) # = 0.2135273
J'ai besoin de réorganiser les données de manière à ce que la corrélation entre les variables soit ~ 0,6. Je dois garder les moyennes et autres statistiques descriptives (sd, min, max, etc.) des deux variables constantes.
Je sais qu'il est possible de faire presque n'importe quelle corrélation avec les données fournies, à savoir:
d2 = with(d,data.frame(x=sort(x),y=sort(y)))
plot(d2$x,d2$y)
abline(lm(y~x,d2), col="red")
cor(d2$x,d2$y) # i.e. 0.9965585
Si j'essaie d'utiliser la sample
fonction pour cette tâche:
cor.results = c()
for(i in 1:1000){
set.seed(i)
d3 = with(d,data.frame(x=sample(x),y=sample(y)))
cor.results = c(cor.results,cor(d3$x,d3$y))
}
J'obtiens un large éventail de corrélations:
> summary(cor.results)
Min. 1st Qu. Median Mean 3rd Qu. Max.
-0.281600 -0.038330 -0.002498 -0.001506 0.034380 0.288800
mais cette plage dépend du nombre de lignes dans le bloc de données et diminue avec l'augmentation de la taille.
> d = data.frame(x=runif(1000,0,100),y = runif(1000,0,100))
> cor.results = c()
> for(i in 1:1000){
+ set.seed(i)
+ d3 = with(d,data.frame(x=sample(x),y=sample(y)))
+ cor.results = c(cor.results,cor(d3$x,d3$y))
+ }
> summary(cor.results)
Min. 1st Qu. Median Mean 3rd Qu. Max.
-0.1030000 -0.0231300 -0.0005248 -0.0005547 0.0207000 0.1095000
Ma question est:
Comment réorganiser un tel ensemble de données pour obtenir une corrélation donnée (ie 0,7)? (Il sera également utile que la méthode supprime la dépendance à la taille de l'ensemble de données)
la source
Pour générer deux distributions uniformes avec une corrélation spécifiée, l'algorithme de Ruscio et Kaczetow (2008) fonctionnera. Ils fournissent le code R . Vous pouvez ensuite transformer avec une simple fonction linéaire pour obtenir votre cible min, max, moyenne et SD.
Algorithme Ruscio et Kaczetow
Notez que cela est très similaire à la solution de @Sven Hohenstein, sauf qu'elle est itérative, de sorte que la corrélation intermédiaire se rapprochera de plus en plus de la corrélation cible jusqu'à ce qu'elles soient indiscernables. Notez également que cet algorithme peut être utilisé pour générer une grande population (par exemple, N = 1 million) à partir de laquelle tirer des échantillons plus petits - ce qui est utile si vous devez avoir une erreur d'échantillonnage.
Pour un poste connexe: corrélation et distributions non normales
Préserver les statistiques descriptives
Il n'y a aucune garantie que l'algorithme produira exactement les mêmes descriptifs. Cependant, comme la moyenne et l'écart-type d'une distribution uniforme sont déterminés par ses valeurs min et max, vous pouvez simplement ajuster les valeurs min et max pour tout corriger.
Référence:
Ruscio, J. et Kaczetow, W. (2008). Simulation de données non normales multivariées à l'aide d'un algorithme itératif. Multivariate Behavioral Research, 43, 355–381. doi: 10.1080 / 00273170802285693
la source
Je suppose que lorsque vous dites «rééchantillonner», vous voulez dire «simuler», ce qui est plus général. Ce qui suit est le moyen le plus concis que je connaisse pour simuler des données normales à deux variables avec une corrélation spécifiée. Remplacez vos propres valeurs souhaitées par r et n.
la source