У меня есть следующий простой набор данных с двумя непрерывными переменными; то есть:
d = data.frame(x=runif(100,0,100),y = runif(100,0,100))
plot(d$x,d$y)
abline(lm(y~x,d), col="red")
cor(d$x,d$y) # = 0.2135273
Мне нужно переставить данные таким образом, чтобы корреляция между переменными составляла ~ 0,6. Мне нужно, чтобы средства и другая описательная статистика (sd, min, max и т. Д.) Обеих переменных были постоянными.
Я знаю, что можно сделать практически любую корреляцию с данными данными, т.е.
d2 = with(d,data.frame(x=sort(x),y=sort(y)))
plot(d2$x,d2$y)
abline(lm(y~x,d2), col="red")
cor(d2$x,d2$y) # i.e. 0.9965585
Если я попытаюсь использовать sample
функцию для этой задачи:
cor.results = c()
for(i in 1:1000){
set.seed(i)
d3 = with(d,data.frame(x=sample(x),y=sample(y)))
cor.results = c(cor.results,cor(d3$x,d3$y))
}
Я получаю довольно широкий спектр корреляций:
> summary(cor.results)
Min. 1st Qu. Median Mean 3rd Qu. Max.
-0.281600 -0.038330 -0.002498 -0.001506 0.034380 0.288800
но этот диапазон зависит от количества строк во фрейме данных и уменьшается с увеличением размера.
> d = data.frame(x=runif(1000,0,100),y = runif(1000,0,100))
> cor.results = c()
> for(i in 1:1000){
+ set.seed(i)
+ d3 = with(d,data.frame(x=sample(x),y=sample(y)))
+ cor.results = c(cor.results,cor(d3$x,d3$y))
+ }
> summary(cor.results)
Min. 1st Qu. Median Mean 3rd Qu. Max.
-0.1030000 -0.0231300 -0.0005248 -0.0005547 0.0207000 0.1095000
Мой вопрос:
Как переставить такой набор данных, чтобы получить данную корреляцию (т. Е. 0,7)? (Будет также хорошо, если метод уберет зависимость от размера набора данных)
источник
Для генерации двух равномерных распределений с заданной корреляцией будет работать алгоритм Ruscio & Kaczetow (2008). Они предоставляют R код . Затем вы можете преобразовать с помощью простой линейной функции, чтобы получить ваши минимальные, максимальные, средние значения и SD.
Алгоритм Русчио и Кацетова
Обратите внимание, что это очень похоже на решение @Sven Hohenstein, за исключением того, что оно итеративное, поэтому промежуточная корреляция будет становиться все ближе и ближе к целевой корреляции, пока они не будут неразличимы. Также обратите внимание, что этот алгоритм может использоваться для генерации большой совокупности (например, N = 1 миллион), из которой можно выбирать меньшие выборки - это полезно, если вам нужна ошибка выборки.
Для соответствующего поста: корреляция и ненормальные распределения
Сохранение описательной статистики
Нет гарантии, что алгоритм выдаст точно такие же описания. Тем не менее, поскольку среднее значение равномерного распределения и SD определяются его минимальным и максимальным значениями, вы можете просто настроить минимальное и максимальное значения, чтобы все исправить.
Ссылка:
Ruscio, J. & Kaczetow, W. (2008). Моделирование многомерных ненормальных данных с использованием итерационного алгоритма. Многомерное поведенческое исследование, 43, 355–381. DOI: 10,1080 / 00273170802285693
источник
Я предполагаю, что когда вы говорите «ресамплировать», вы имеете в виду «симулировать», что является более общим. Ниже приведен самый краткий способ, которым я знаю, для моделирования нормальных, двумерных данных с заданной корреляцией. Подставьте свои собственные желаемые значения для r и n.
источник