IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

R Discussion :

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


Sujet :

R

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

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2015
    Messages : 71
    Points : 67
    Points
    67
    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 ?

    Merci par avance,

    Alex

  2. #2
    Membre confirmé
    Inscrit en
    Février 2011
    Messages
    276
    Détails du profil
    Informations forums :
    Inscription : Février 2011
    Messages : 276
    Points : 561
    Points
    561
    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
    71
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2015
    Messages : 71
    Points : 67
    Points
    67
    Par défaut
    Merci tototode, je suis dans le cas où mes variables suivent une loi normale donc nickel.

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

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2015
    Messages : 71
    Points : 67
    Points
    67
    Par défaut
    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 :
    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
    Savez-vous pourquoi et avez vous une idée pour pourvoir prendre en compte également ce type de corrélation ?

    Merci par avance,

    Alex

  5. #5
    Membre confirmé
    Inscrit en
    Février 2011
    Messages
    276
    Détails du profil
    Informations forums :
    Inscription : Février 2011
    Messages : 276
    Points : 561
    Points
    561
    Par défaut
    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 :
    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
    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.

    cdlt

  6. #6
    Membre éclairé
    Homme Profil pro
    Chercheur
    Inscrit en
    Décembre 2015
    Messages
    327
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2015
    Messages : 327
    Points : 793
    Points
    793
    Par défaut
    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
    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))

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

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2015
    Messages : 71
    Points : 67
    Points
    67
    Par défaut
    Merci tototode et faubry pour vos réponses. J'avais pas eu le temps de revenir à cette discussion.

    Je vais donc rajouter cette condition dans mon programme pour ne réaliser les simulations seulement si les 2 critères sont respectés.

    PS : Correction du titre : "Simulations de 3 variables aléatoires corréléEs entre elles".

+ 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