33 votos

Generar dos variables con una correlación precisa preestablecida

ACTUALIZACIÓN: Solución

Gracias a Greg Snow por señalar el empirical = TRUE ¡comando en mvrnorm (cosas normales aleatorias multivariadas)! Aquí está el código explícito:

samples = 200
r = 0.83

library('MASS')
data = mvrnorm(n=samples, mu=c(0, 0), Sigma=matrix(c(1, r, r, 1), nrow=2), empirical=TRUE)
X = data[, 1]  # standard normal (mu=0, sd=1)
Y = data[, 2]  # standard normal (mu=0, sd=1)

# Assess that it works
cor(X, Y)  # yay, r = 0.83!
cor(X*0.01 + 42, Y*3 - 1)  # Linear transformations of X and Y won't change r.

Pregunta original

Quiero generar dos variables con números (pseudo) aleatorios con una r exacta de Pearson. ¡Soluciones en Python y/o R estarían bien!

Soy capaz de generar datos aleatorios que se aproximen a una r preestablecida en python de la siguiente manera. No busco aproximaciones sino datos que con una r exacta preespecificada, es decir, con r=0,83000 en el ejemplo de abajo:

samples = 200
r = 0.83

# Generate pearson correlated data with approximately cor(X, Y) = r
import numpy as np
data = np.random.multivariate_normal([0, 0], [[1, r], [r, 1]], size=samples)
X, Y = data[:,0], data[:,1]

# That's it! Now let's take a look at the actual correlation:
import scipy.stats as stats
print 'r=', stats.pearsonr(X, Y)[0]

La motivación para conocer r es que estoy probando modelos estadísticos (bayesianos) que pueden inferir r de los datos y son mucho más fáciles de evaluar cuando r está bien especificado.

20voto

Eero Puntos 1612

En el caso de R, se puede utilizar la función mvrnorm en el paquete MASS y establecer empirical=TRUE .

O este puesto muestra los pasos en R para crear nuevas variables con correlaciones específicas con una variable existente.

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X