Построение коррелированных переменных

У меня есть переменная с заданным распределением (нормальным в моем примере ниже).

set.seed(32)    
var1 = rnorm(100,mean=0,sd=1)

Я хочу создать переменную (var2), которая коррелирует с var1 с коэффициентом линейной корреляции (примерно или точно), равным «Corr». Наклон регрессии между var1 и var2 должен (примерно или точно) равняться 1.

Corr = 0.3

Как этого добиться?

Я хотел сделать что-то вроде этого:

decorelation = rnorm(100,mean=0,sd=1-Corr)
var2 = var1 + decorelation

Но, конечно, при запуске:

cor(var1,var2)

Результат и близко не Корр!


person Remi.b    schedule 11.06.2013    source источник
comment
Вот соответствующий ответ на другом сайте: quant.stackexchange.com/questions/1027/   -  person bill_080    schedule 11.06.2013
comment
Это дубликат stats.stackexchange.com/questions/15011/   -  person eddi    schedule 11.06.2013
comment
Связанный с этим вопрос: stackoverflow .com/questions/16122520/   -  person Vincent Zoonekynd    schedule 11.06.2013


Ответы (1)


Я сделал что-то подобное некоторое время назад. Я вставляю некоторый код для 3 коррелированных переменных, но его можно легко обобщить до чего-то более сложного.

Сначала создайте F-матрицу:

cor_Matrix <-  matrix(c (1.00, 0.90, 0.20 ,
                     0.90, 1.00, 0.40 ,
                     0.20, 0.40, 1.00), 
                  nrow=3,ncol=3,byrow=TRUE)

Это может быть произвольная корреляционная матрица.

library(psych) 

fit<-principal(cor_Matrix, nfactors=3, rotate="none")

fit$loadings

loadings<-matrix(fit$loadings[1:3, 1:3],nrow=3,ncol=3,byrow=F)
loadings

#create three rannor variable

cases <- t(replicate(3, rnorm(3000)) ) #edited, changed to 3000 cases from 150 cases

multivar <- loadings %*% cases
T_multivar <- t(multivar)

var<-as.data.frame(T_multivar)

cor(var)

Опять же, это можно обобщить. Перечисленный выше подход не создает многомерный набор данных.

person SprengMeister    schedule 11.06.2013
comment
Большое спасибо ! Есть ли способ при наличии многих переменных позволить некоторой корреляции в cor_Matrix быть чем угодно, чтобы она не искажала другие корреляции? Например, если я хочу, чтобы cor(var1,var2) == 0,8, cor(var1,var3) == 0,3. Если я напишу cor(var2,var3) == 1 (или == любое другое число), это сместит две другие корреляции. Так есть ли способ оставить одну корреляцию невыбранной? - person Remi.b; 11.06.2013
comment
привет, я не совсем уверен, что вы имеете в виду, но выбор двух корреляций (например, r (xy) и r (yz) не должен каким-либо образом влиять на то, как коррелируются r (xz). Таким образом, нет смещения. Вы можете оставить их некоррелированными , Вы думаете об ошибке? Я думаю, вы могли бы добавить к этой корреляции некоторую ошибку. Вы могли бы добавить к каждой переменной случайную величину со средним значением = 0 и и произвольно выбранным SD. - person SprengMeister; 11.06.2013
comment
Хорошо, если вы используете эти два разных cor_Matrix (после установки семян): c(1,0.9,0.2, 0.9,1,0.4, 0.2,0.4,1) и c(1,0.9,0.2, 0.9,1,0.7, 0.2,0.7,0.1) вы получите разные результаты корреляции между двумя первыми переменными, хотя их корреляция не изменится. не так ли? - person Remi.b; 11.06.2013
comment
Я понимаю, что могу быть немного далек от понимания вашего кода. почему этот cor_Matrix=matrix(c(rep(1,9)) дает очень плохие корреляции? - person Remi.b; 11.06.2013
comment
Привет, Реми, я думаю, теперь я могу понять. То, что вы видите, может быть ошибкой выборки. В моем коде выше я создаю только 150, что оставляет место для существенной ошибки выборки. Я изменил в коде выше ошибку выборки на 3000. Теперь вы можете самостоятельно менять интеркорреляции и они будут близки к тому, что вы заложили в F Матрицу. - person SprengMeister; 11.06.2013
comment
Привет. Дело не в ошибке выборки. Но я могу не понять cor_Matrix. Разве я не должен вводить значения корреляций, которые я хочу получить? Когда мы создаем cor_Matrix только из девяти единиц, результаты: › cor(var) вовсе не является матрицей из 1 ! (независимо от размера выборки). Спасибо SprengMeister за то, что нашли время помочь мне! - person Remi.b; 11.06.2013
comment
со всеми переменными, коррелированными ровно на 1,0, анализ основных компонентов выдает ошибку. Изменили ли вы количество сгенерированных случаев на что-то намного большее, чем 150 случаев. Я проверил код и получил ожидаемые результаты. РЕДАКТИРОВАТЬ: обратите внимание, что значения могут быть не совсем теми значениями, которые вы указали в F-матрице, но они должны приближаться к ним. - person SprengMeister; 11.06.2013
comment
давайте продолжим это обсуждение в чате - person Remi.b; 12.06.2013