Для исследования моделирования я должен генерировать случайные переменные , которые показывают prefined (населения) корреляцию с существующей переменной .
Я посмотрел на R
пакеты copula
и CDVine
которые могут производить случайные многомерные распределения с заданной структурой зависимостей. Однако невозможно зафиксировать одну из результирующих переменных в существующей переменной.
Любые идеи и ссылки на существующие функции приветствуются!
Вывод: пришли два правильных ответа с разными решениями:
R
Сценарий по каракал, который вычисляет случайную переменную с точным (образец) корреляции с предопределенной переменнойR
Функция я очутилась, который вычисляет случайную величину с определенной популяцией корреляцией с предопределенным переменным
[@ttnphns 'добавление: я взял на себя смелость расширить заголовок вопроса с одного случая с фиксированной переменной на произвольное количество фиксированных переменных; то есть, как генерировать переменную, имеющую предопределенную корреляцию (и) с некоторой фиксированной, существующей переменной (ами)]
источник
Ответы:
Вот еще один: для векторов со средним 0 их корреляция равна косинусу их угла. Итак, один из способов найти вектор с точно желаемой корреляцией , соответствующей углу :r θИкс р θ
Вот код:
Для ортогональной проекции я использовал разложение для улучшения числовой устойчивости, поскольку тогда просто .Q R P = Q Q ′P QR P=QQ′
источник
P <- X %*% solve(t(X) %*% X) %*% t(X)
не дает r = 0,6, так что это не обходной путь . Я все еще в замешательстве. (Я был бы рад подражать вашему выражениюQ <- qr.Q(qr(Xctr[ , 1, drop=FALSE]))
в SPSS, но не знаю как.)Xctr[ , 1] %*% solve(t(Xctr[ , 1]) %*% Xctr[ , 1]) %*% t(Xctr[ , 1])
Xctr
rho=1
я счел полезным сделать что-то вроде этого: вif (isTRUE(all.equal(rho, 1))) rho <- 1-10*.Machine$double.eps
противном случае я получалNaN
sЯ опишу наиболее общее возможное решение. Решение проблемы в этой общности позволяет нам достичь удивительно компактной программной реализации: достаточно двух коротких строк
R
кода.Выберите вектор той же длины, что и , в соответствии с любым распределением, которое вам нравится. Пусть быть остатки регрессии наименьших квадратов против : это извлекает компонент из . Добавляя назад подходящее кратное в , мы можем производить вектор , имеющий любую требуемую корреляционную с . До произвольной аддитивной константы и положительной мультипликативной константы - которую вы можете выбрать любым способом - решение -Y Y ⊥ X Y Y X Y Y ⊥ ρ YX Y Y⊥ X Y Y X Y Y⊥ ρ Y
(« » означает любой расчет, пропорциональный стандартному отклонению.)SD
Вот рабочийX
R
код. Если вы не предоставите , код будет извлекать свои значения из многомерного стандартного нормального распределения.Чтобы проиллюстрировать это , я произвел случайный с компонентами и производится , имеющую различные заданные корреляции с этим . Все они были созданы с одинаковым начальным вектором . Вот их диаграммы рассеяния. «Коврики» внизу каждой панели показывают общий векторY 50 XY;ρ Y X=(1,2,…,50) Y
Среди сюжетов есть замечательное сходство, не так ли :-).
Если вы хотите поэкспериментировать, вот код, который создал эти данные, и рисунок. (Я не удосужился использовать свободу для сдвига и масштабирования результатов, что является простой операцией.)
Кстати, этот метод легко обобщает более чем на один : если это математически возможно, он найдет с указанными корреляциями с целым набор . Просто используйте обычные наименьшие квадраты, чтобы убрать эффекты всех из и сформировать подходящую линейную комбинацию и остатков. (Это помогает сделать это с точки зрения двойного базиса для , который получается путем вычисления псевдообратного кода. Следующий код использует SVD для для достижения этой цели.)Y XY1,Y2,…,Yk;ρ1,ρ2,…,ρk Yi Yi X Yi Y Y
Вот эскиз алгоритма, вYi
R
котором представлены в виде столбцов матрицы :y
Ниже приведена более полная реализация для тех, кто хотел бы поэкспериментировать.
источник
BTW, this method readily generalizes to more... Just use ordinary least squares... and form a suitable linear combination
x
и я хочу создать новый вектор,y
связанный с ним,x
но также хочу, чтобыy
вектор был равномерно распределен.Вот еще один вычислительный подход (решение адаптировано из сообщения на форуме Энрико Шумана). Согласно Вольфгангу (см. Комментарии), это вычислительно идентично решению, предложенному ttnphns.
В отличие от решения Каракала, он не дает выборку с точной корреляцией , но два вектора, корреляция населения которых равна .ρ ρ
Следующая функция может вычислить двумерное распределение выборки, взятой из совокупности с заданным значением . Он либо вычисляет две случайные переменные, либо берет одну существующую переменную (переданную в качестве параметра ) и создает вторую переменную с желаемой корреляцией:ρ
x
Функция также может использовать ненормальные предельные распределения, регулируя параметр
mar.fun
. Обратите внимание, однако, что исправление одной переменной работает только с нормально распределенной переменнойx
! (что может относиться к комментарию Макроса).Также обратите внимание, что «небольшой поправочный коэффициент» из исходного поста был удален, так как он, кажется, смещает результирующие корреляции, по крайней мере, в случае гауссовых распределений и корреляций Пирсона (также см. Комментарии).
источник
rho
.X2 <- mar.fun(n)
чтобыX2 <- mar.fun(n,mean(x),sd(x))
получить желаемое соотношение между x1 и x2Пусть будет вашей фиксированной переменной, и вы хотите сгенерировать переменную которая коррелирует с на величину . Если стандартизирован, то (потому что - это бета-коэффициент в простой регрессии) , где - случайная величина из нормального распределения, имеющая среднее значение и . Наблюдаемая корреляция между данными и будет приблизительно равна ; и можно рассматривать как случайные выборки из двумерной нормальной популяции (еслиX Y X r X r Y=rX+E E 0 sd=1−r2−−−−−√ X Y r X Y X от нормального) с .ρ=r
E Xr E X E X Y X1,X2,X3,...
Обновление 11 ноября 2017 г. Сегодня я наткнулся на эту старую ветку и решил расширить свой ответ, показав алгоритм итеративной подгонки, о котором я говорил вначале.
Отказ от ответственности: Это итеративное решение, которое я нашел, уступает превосходному, основанному на поиске двойного базиса и предложенному @whuber в этой теме сегодня. Решение @ whuber не является итеративным, и, что для меня более важно, оно, по-видимому, влияет на значения входной переменной «pig» несколько меньше, чем алгоритм «my» (тогда было бы полезно, если бы задача «исправить») существующая переменная, а не генерировать случайные изменения с нуля). Тем не менее, я публикую свою для любопытства и потому, что это работает (см. Также сноску).
(знаменатель не меняется на итерациях, рассчитайте его заранее)
Или, альтернативно, более эффективная формула дополнительно гарантирует, что среднее значение станет . Сначала сделайте центр на каждой итерации перед вычислением s на шаге 7, затем на этом шаге 8 исправьте как:E 0 E C
(опять же знаменатели известны заранее)1
Приведите к его целевому значению:SSE Ei[corrected]=EiSSS/SSE−−−−−−−−√
Перейдите к шагу 7. (Скажем, сделайте, например, 10-20 итераций; чем больше тем больше итераций может понадобиться. Если целевой был реалистичным, положителен, а если размер выборки не слишком мал, итерации всегда прямой к конвергенции. Конец итерации.)m r SSS n
Готов: все теперь почти равны нулю, что означает, что остатки обучены восстанавливать целевые значения . Вычислить фитинг : .Е Г У У [ исправлено ] = У + ЕC E r Y Y[corrected]=Y^+E
Полученный практически стандартизирован. В качестве последнего штриха, вы можете точно стандартизировать его, опять же, как вы это делали на шаге 2.Y
Вы можете указать с любым отклонением и означать, что вам нравится. Собственно, среди четырех статистик - мин , макс , скуп , ст. DEV . - вы можете выбрать любые два значения и линейно преобразовать переменную так, чтобы она представляла их без изменения s (корреляций), которые вы достигли (это все называется линейным масштабированием).гY r
Чтобы предупредить снова, что было сказано выше. С этим потягиванием точно к , выход не должен быть нормально распределен.r YY r Y
Y X1 Формула коррекции может быть еще более сложной, например, чтобы обеспечить большую гомоскедастичность (в терминах сумм квадратов) также для каждого , одновременно с получением корреляций, - я реализовал код для этого слишком. (Я не знаю, если такая «двойная» задача разрешима с помощью более аккуратного - не итеративного - подхода, такого как Whuber .)Y X
источник
Мне захотелось немного программировать, поэтому я взял удаленный ответ @ Adam и решил написать хорошую реализацию на R. Я сосредотачиваюсь на использовании функционально ориентированного стиля (т. Е. Цикла цикла lapply). Общая идея состоит в том, чтобы взять два вектора, случайным образом переставляя один из векторов, пока между ними не будет достигнута определенная корреляция. Этот подход очень грубый, но простой в реализации.
Сначала мы создаем функцию, которая случайным образом переставляет входной вектор:
... и создать пример данных
... написать функцию, которая переставляет входной вектор и соотносит его с опорным вектором:
... и повторять тысячу раз:
Обратите внимание , что правила области АиР гарантировать , что
vec1
иvec2
находятся в глобальной среде, вне анонимной функции , используемой выше. Итак, все перестановки относятся к исходным наборам тестовых данных, которые мы сгенерировали.Далее находим максимальную корреляцию:
... или найти наиболее близкое значение к соотношению 0,2:
Чтобы получить более высокую корреляцию, вам нужно увеличить количество итераций.
источник
Решение:
Код Python:
Тестовый вывод:
источник
Генерация нормальных переменных с ковариационной матрицей SAMPLING, как указано
Генерация нормальных переменных с ковариационной матрицей численности населения, как указано
источник
Просто создайте случайный вектор и сортируйте, пока не получите желаемый r.
источник