1. #1
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    mars 2015
    Messages
    63
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : mars 2015
    Messages : 63
    Points : 60
    Points
    60

    Par défaut Simulations de 3 variables aléatoires corrélés entre elles

    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 ?

    Ce lien intéressant http://forums.cirad.fr/logiciel-R/viewtopic.php?t=3028 fourni une réponse pour la simulation de 2 variables corrélés entre-elles. Peut-être que le code pourrait être une bonne base pour adapter à 3 variables ou plus ?

    Merci par avance,

    Alex

  2. #2
    Nouveau membre du Club
    Inscrit en
    février 2011
    Messages
    26
    Détails du profil
    Informations forums :
    Inscription : février 2011
    Messages : 26
    Points : 36
    Points
    36

    Par défaut

    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 :
    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))
    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.

    Si tu veux des corrélations parfaitement égales à ce que tu souhaites alors tu peux faire comme ceci :
    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
    Cordialement

  3. #3
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    mars 2015
    Messages
    63
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : mars 2015
    Messages : 63
    Points : 60
    Points
    60

    Par défaut

    Merci tototode, je suis dans le cas où mes variables suivent une loi normale donc nickel.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Simulation variable aléatoire
    Par crtttt dans le forum Scilab
    Réponses: 4
    Dernier message: 01/12/2010, 21h28
  2. Simulation de variables aléatoires de loi donnée
    Par ksper45 dans le forum Probabilités
    Réponses: 3
    Dernier message: 21/10/2008, 09h50
  3. Réponses: 4
    Dernier message: 18/04/2007, 10h22

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo