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)