Bonjour,
J'aimerai simuler 3 variables corrélés entre elles. Par exemple :
- A et B avec une corrélation de 0,6 ;
- A et C avec une corrélation de 0,9 ;
- B et C avec une corrélation de 0,4.
Est-ce réalisable ?
Merci par avance,
Alex
Bonjour,
J'aimerai simuler 3 variables corrélés entre elles. Par exemple :
- A et B avec une corrélation de 0,6 ;
- A et C avec une corrélation de 0,9 ;
- B et C avec une corrélation de 0,4.
Est-ce réalisable ?
Merci par avance,
Alex
Bonjour,
tout dépend de la distribution marginale de chaque variable. Si chaque variable suit une loi normale alors pas de soucis sinon je ne peux t'aider. Dans le package MASS tu as la fonction mvrnorm qui permet de faire ça mais il faut spécifier les moyennes de chaque loi et la matrice de variance-covariance qu'il faut définir en fonction des écarts-types de chaque variable et des corrélations entre les variables.
Si tu veux juste des variables corrélées et peut importe leurs variances et moyennes alors tu peux faire :
Après comme il s'agit de simulations tu seras proche des corrélations que tu souhaites sans pour autant qu'elles soient parfaitement égales.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 library(MASS) # si tu veux 1000 valeurs mat <- mvrnorm(n = 1000, mu = rep(1,3), Sigma = matrix(c(1, 0.6, 0.9, 0.6, 1, 0.4, 0.9, 0.4, 1), 3, 3))
Si tu veux des corrélations parfaitement égales à ce que tu souhaites alors tu peux faire comme ceci :Cordialement
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51 corxtoy <- function(cor,x,y,...){ # fonction qui recrée un vecteur x qui soit corrélé avec y avec # les valeurs de corrélation que l'on veut # cor : les valeurs de corréaltions de x avec les autres vecteurs (y, ...) # x : le vecteur initial a transformé # y, ... : le ou les vecteurs qui vont être corrélés avec x # y peut être soit un vecteur soit une matrice avec déjà les vecteurs dedans # si y est un vecteur et que l'on veut que x soit corrélé a plus de un vecteur # on écrit le nom des vecteurs à la suite de y : corxtoy(c(0.1,0.2,0.3),x,y,w,z) if (!inherits(y,"matrix") && !is.vector(y)) stop("y must be a matrix or a vector") m <- cbind(y,...) ordcor <- order(cor,decreasing=TRUE) m <- m[,ordcor, drop=FALSE] cor <- cor[ordcor] cor1 <- cor(m) if (!identical(length(cor),ncol(m))) stop("must have the same number of cor and vectors") if (!identical(length(x),nrow(m))) stop("x and covariate variables must have the same length") m <- cbind(m,x) m2 <- scale(m) c1 <- chol(var(m2)) m3 <- m2 %*% solve(c1) cor2 <- cbind( rbind( cor1, x=cor ), x=c(cor,1) ) # créer une nouvelle matrice m4 <- m3 %*% chol(cor2) # dé-centrer et dé-réduire m5 <- sweep( m4, 2, attr(m2, 'scaled:scale'), '*') m5 <- sweep( m5, 2, attr(m2, 'scaled:center'), '+') x <- m5[,"x"] x } library(MASS) mat <- mvrnorm(n = 1000, mu = rep(1,3), Sigma = matrix(c(1, 0.6, 0.9, 0.6, 1, 0.4, 0.9, 0.4, 1), 3, 3)) mat[,1] <- corxtoy(0.6, mat[,1], mat[,2]) mat[,3] <- corxtoy(c(0.9,0.4), mat[,3], mat[,1:2]) cor(mat) [,1] [,2] [,3] [1,] 1.0 0.6 0.9 [2,] 0.6 1.0 0.4 [3,] 0.9 0.4 1.0
Merci tototode, je suis dans le cas où mes variables suivent une loi normale donc nickel.
Bonjour,
Je me permets de revenir sur le sujet.
J'ai remarqué qu'avec en entrée des corrélations comprises entre -0.99 et -0.5 le programme ne fonctionnait pas. J'obtiens cette erreur :
Savez-vous pourquoi et avez vous une idée pour pourvoir prendre en compte également ce type de corrélation ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 Error in chol.default(cor2) : the leading minor of order 3 is not positive definite
Merci par avance,
Alex
Bonjour,
je pense que le problème est plus un problème d'ordre mathématique que lié à la programmation. Peut-être peux-tu savoir si les corrélations sont mathématiquement possibles entre toutes tes variables en essayant la fonction mvrnorm, et si ça ne fonctionne pas alors s'arrêter la. Il faudrait voir sur le net comment déterminer si une matrice de corrélation est plausible ou non.
A priori une des conditions est que la matrice de la variance-covariance soit défnit positive. Une façon de faire serait de regarder si toutes les valeurs propres de la matrice de variance co-variance sont positives :A priori trois variables de variance 1 et avec des covariances 2 à 2 de -0.99 ça ne semble pas possibles tout du moins dans R3. Après je ne suis pas un matheux non plus donc ça demanderait confirmation.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 mat <- structure(c(1, -0.99, -0.99, -0.99, 1, -0.99, -0.99, -0.99, 1 ), .Dim = c(3L, 3L)) mat [,1] [,2] [,3] [1,] 1.00 -0.99 -0.99 [2,] -0.99 1.00 -0.99 [3,] -0.99 -0.99 1.00 eigen(mat)$values [1] 1.99 1.99 -0.98
cdlt
Voici deux critères pour qu'une matrice soit une matrice de corrélation :
1) critère d'Hadamard [nécessaire et suffisant] adapté aux matrice de corrélation (diagonale = 1) :
avec l'égalité si les vecteurs colonnes sont orthogonaux
Code : Sélectionner tout - Visualiser dans une fenêtre à part abs( det( mat)) <= 1
2) condition suffisante :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 mat2 <- mat diag( mat2) <- 0 all( rowSums( abs( mat2)) <= diag( mat)) # pour une matrice de corrélation diag( mat) <- rep( 1, nrow( mat))
Partager