Simuler deux variables aléatoires liées par un coef de correlation déterminé.

Postez ici vos questions, réponses, commentaires ou suggestions - Les sujets seront ultérieurement répartis dans les archives par les modérateurs

Modérateur : Groupe des modérateurs

Wilfrid Car
Messages : 59
Enregistré le : 09 Avr 2015, 13:35

Simuler deux variables aléatoires liées par un coef de correlation déterminé.

Messagepar Wilfrid Car » 30 Nov 2015, 11:32

Bonjour,
Dans un but pédagogique, je cherche à visualiser des nuages de points présentant la liaison entre deux variables aléatoires en fonction d' un r déterminé.
A cela se rajoute les objectifs suivants:
Afficher des nuages qui peuvent également varier selon le nombre d'individus.
Je cherche également à fixer les bornes des variables aléatoires pour que ma présentation soit la plus porche possible des données réelles.

Toute aide est la bienvenue

Wilfrid

denis laloe
Messages : 119
Enregistré le : 28 Déc 2006, 13:05

Re: Simuler deux variables aléatoires liées par un coef de correlation déterminé.

Messagepar denis laloe » 30 Nov 2015, 14:57

Bonjour,
voilà un exemple où on simule 100 valeurs d'une distribution suivant une loi binormale, avec un coefficient de corrélation de 0.8

library(MASS)
sigma<-matrix(c(1,.8,.8,1),byrow=TRUE,nrow=2)
t100<-mvrnorm(100,mu=c(0,0),Sigma=sigma)

et une représentation du nuage de points correspondants, avec une ellipse

library(ellipse)
plot(ellipse(0.8),type="l",axes=FALSE,col="grey")
points(t100[,c(1,2)],col="blue")

Wilfrid Car
Messages : 59
Enregistré le : 09 Avr 2015, 13:35

Re: Simuler deux variables aléatoires liées par un coef de correlation déterminé.

Messagepar Wilfrid Car » 30 Nov 2015, 16:18

merci pour cette réponse, je vais tenter de décoder!

Nicolas Péru
Messages : 1408
Enregistré le : 07 Aoû 2006, 08:13

Re: Simuler deux variables aléatoires liées par un coef de correlation déterminé.

Messagepar Nicolas Péru » 30 Nov 2015, 16:49

Bonjour,

via mvnorm la réponse n'est valable que pour des variables normées donc s'il s'agit de se rapprocher de cas réels ça va être plus compliqué que ça.

Nicolas

François Bonnot
Messages : 537
Enregistré le : 10 Nov 2004, 15:19
Contact :

Re: Simuler deux variables aléatoires liées par un coef de correlation déterminé.

Messagepar François Bonnot » 01 Déc 2015, 07:37

via mvnorm la réponse n'est valable que pour des variables normées donc s'il s'agit de se rapprocher de cas réels ça va être plus compliqué que ça

Bonjour,
Une transformation affine de chaque variable ne change pas la corrélation :

Code : Tout sélectionner

min1 <- 10; max1 <- 100; min2 <- 50; max2 <- 200
t100[,1] <- min1+(t100[,1]-min(t100[,1]))*(max1-min1)/diff(range(t100[,1]))
t100[,2] <- min2+(t100[,2]-min(t100[,2]))*(max2-min2)/diff(range(t100[,2]))
François

Wilfrid Car
Messages : 59
Enregistré le : 09 Avr 2015, 13:35

Re: Simuler deux variables aléatoires liées par un coef de correlation déterminé.

Messagepar Wilfrid Car » 01 Déc 2015, 15:00

Merci pour ces réponses mais, j'avoue être un peu perdu devant la complexité de la tâche.

J'ai trouvé ce code sur stacExchange http://stats.stackexchange.com/questions/66610/generate-pairs-of-random-numbers-uniformly-distributed-and-correlated

- Aspect positif: r et n facilement paramétrables.
- Beaucoup de mal à décoder le reste (c'est à dire tout!)
- Je n'arrive pas à simplifier la génération des données pour ne conserver qu'un diagramme..
- Set.seed(123) : non obligatoire (permet de conserver le même tirage d'une exécution à une autre?)

Wilfrid

Code : Tout sélectionner

## Initialization and parameters
set.seed(123)
r <- 0.6                            # Target (Spearman) correlation
n <- 500                            # Number of samples

## Functions
gen.gauss.cop <- function(r, n){
    rho <- 2 * sin(r * pi/6)        # Pearson correlation
    P <- toeplitz(c(1, rho))        # Correlation matrix
    d <- nrow(P)                    # Dimension
    ## Generate sample
    U <- pnorm(matrix(rnorm(n*d), ncol = d) %*% chol(P))
    return(U)
}

## Data generation and visualization
U <- gen.gauss.cop(r = r, n = n)
pairs(U, diag.panel = function(x){
          h <- hist(x, plot = FALSE)
          rect(head(h$breaks, -1), 0, tail(h$breaks, -1), h$counts/max(h$counts))})

François Bonnot
Messages : 537
Enregistré le : 10 Nov 2004, 15:19
Contact :

Re: Simuler deux variables aléatoires liées par un coef de correlation déterminé.

Messagepar François Bonnot » 02 Déc 2015, 07:32

j'avoue être un peu perdu devant la complexité de la tâche

Bonjour,
Les codes que Denis et moi-même vous proposons ne comportent (hormis les instruction "library") que 7 lignes...
Beaucoup de mal à décoder le reste (c'est à dire tout!)

La théorie est expliquée dans le lien que vous donnez, le reste n'est que programmation.
Je n'arrive pas à simplifier la génération des données pour ne conserver qu'un diagramme..

Plot devrait suffire.
Set.seed(123) : non obligatoire (permet de conserver le même tirage d'une exécution à une autre?)

Oui.

Le code de Denis donne des distributions marginales normales (les plus classiques dans un but pédagogique) alors que le code de votre lien donne des distributions marginales uniformes.
La transformation à utiliser pour fixer les bornes est la même dans les deux cas (cf. mes 3 lignes de code).
François

Eric Wajnberg
Messages : 776
Enregistré le : 11 Aoû 2008, 15:37
Contact :

Re: Simuler deux variables aléatoires liées par un coef de correlation déterminé.

Messagepar Eric Wajnberg » 03 Déc 2015, 12:35

Wilfrid Car a écrit :Bonjour,
Dans un but pédagogique, je cherche à visualiser des nuages de points présentant la liaison entre deux variables aléatoires en fonction d' un r déterminé.
A cela se rajoute les objectifs suivants:
Afficher des nuages qui peuvent également varier selon le nombre d'individus.
Je cherche également à fixer les bornes des variables aléatoires pour que ma présentation soit la plus porche possible des données réelles.

Toute aide est la bienvenue

Wilfrid

J'arrive un peu tard dans le débat. Où cas où ceci pourrait servir, voici la fonction que j'utilise pour ce faire, que j'ai écrit il y a des années.

Code : Tout sélectionner

function(n = 100., sx = 1., sy = 1., mux = 0., muy = 0., rho = 0.7)
{
        # tirage de deux variables aleatoires gaussiennes correlees
        u <- rnorm(n) * sqrt(1. - rho * rho) * sy
        x <- rnorm(n, mean = mux, sd = sx)
        y <- rho * (sy/sx) * (x - mux) + muy + u
        cbind(x, y)
}


HTH, Eric.


Retourner vers « Questions en cours »

Qui est en ligne

Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 1 invité