Утворіть пари випадкових чисел, рівномірно розподілених і співвіднесених


14

Я хотів би генерувати пари випадкових чисел з певною кореляцією. Однак звичайний підхід використання лінійної комбінації двох нормальних змінних тут недійсний, оскільки лінійна комбінація рівномірних змінних вже не є рівномірно розподіленою змінною. Мені потрібні дві змінні, щоб вони були рівномірними.

Будь-яка ідея про те, як генерувати пари однорідних змінних із заданою кореляцією?


6
Тісно пов’язані: stats.stackexchange.com/questions/30526 . Ви також хочете перевірити тег copula - просто натисніть на посилання тут. Швидка і брудна техніка полягає в тому, щоб було рівномірним і коли і іншому випадку. Кореляція - \ rho = 2 (\ alpha-1) ^ 3 + 1 , звідки \ alpha = 1 - ((1- \ rho) / 2) ^ {1/3} виконує трюк. Але копули дадуть вам більше контролю .... X[0,1]Y=XXαY=1+αXρ=2(α1)3+1α=1((1ρ)/2)1/3
whuber

Дякую за коментар, але так, я думаю, що цей метод справді "брудний"
Onturenio

1
Я сподівався, що, бачачи такий підхід, ви визнаєте, що можете (і повинні) надати додаткові критерії щодо властивостей ваших пар випадкових чисел. Якщо це "брудно", то саме що з рішенням не так? Скажіть нам, щоб ми могли надати більш відповідні відповіді для вашої ситуації.
whuber

На це запитання відповіли випадково у відповіді на тісно пов'язане питання: як генерувати пари РВ з лінійною регресійною залежністю. Оскільки нахил лінійної регресії пов'язаний легко обчисленим коефіцієнтом кореляції, і всі можливі нахили можуть бути отримані, це дає змогу отримати саме те, що ви хочете. Дивіться stats.stackexchange.com/questions/257779/… .
whuber

1
Будь ласка, дивіться також stats.stackexchange.com/questions/31771 , який відповідає на узагальнення на три випадкові форми.
whuber

Відповіді:


16

Мені не відомий універсальний метод генерування корельованих випадкових величин з будь-якими граничними розподілами. Отже, я запропоную спеціальний метод для генерування пар рівномірно розподілених випадкових змінних із заданою кореляцією Пірсона. Не втрачаючи загальності, я вважаю, що бажаний граничний розподіл є стандартним рівномірним (тобто опора дорівнює ).[0,1]

Пропонований підхід спирається на таке:
а) Для стандартних рівномірних випадкових величин і з відповідними функціями розподілу і маємо , при . Таким чином, за визначенням rho Спірмена є Отже, коефіцієнт кореляції Спірмана та Пірсона рівні (однак версії зразків можуть, однак, відрізнятися).U1U2F1F2Fi(Ui)=Uiρ S ( U 1 , U 2 ) = c o r r ( F 1 ( U 1 ) , F 2 ( U 2 ) ) = c o r r ( U 1 , Ui=1,2

ρS(U1,U2)=corr(F1(U1),F2(U2))=corr(U1,U2).

б) Якщо - випадкові величини з безперервними полями, а копула Гаусса з коефіцієнтом кореляції (Пірсона) , то Спірмена є Це дозволяє легко генерувати випадкові величини, які мають бажане значення rho Spearman.X1,X2ρ

ρS(X1,X2)=6πarcsin(ρ2).

Підхід полягає у формуванні даних з копули Гаусса з відповідним коефіцієнтом кореляції таким, що rho Spearman відповідає бажаній кореляції для рівномірних випадкових величин.ρ

Алгоритм моделювання
Нехай позначає бажаний рівень кореляції, а кількість пар, які потрібно генерувати. Алгоритм:rn

  1. Обчисліть .ρ=2sin(rπ/6)
  2. Створити пару випадкових змінних з копули Гаусса (наприклад, при такому підході )
  3. Повторіть крок 2 рази.n

Приклад
Наступний код є прикладом реалізації цього алгоритму з використанням R з цільовою кореляцією і пар.r=0.6n=500

## 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))})

На малюнку нижче діагональні графіки показують гістограми змінних та , а графіки показують графіки розкиду та . U1U2U1U2введіть тут опис зображення

За кондукцією випадкові величини мають однакові межі та коефіцієнт кореляції (близький до) . Але через ефект вибірки коефіцієнт кореляції модельованих даних не точно дорівнює .rr

cor(U)[1, 2]
# [1] 0.5337697

Зауважте, що gen.gauss.copфункція повинна працювати з більш ніж двома змінними, просто вказавши більшу кореляційну матрицю.

Модельне дослідження
Наступне дослідження моделювання, повторене для цільової кореляції дозволяє припустити, що розподіл коефіцієнта кореляції збільшиться до потрібної кореляції у міру збільшення розміру вибірки .r=0.5,0.1,0.6n

## Simulation
set.seed(921)
r <- 0.6                                                # Target correlation
n <- c(10, 50, 100, 500, 1000, 5000); names(n) <- n     # Number of samples
S <- 1000                                               # Number of simulations

res <- sapply(n,
              function(n, r, S){
                   replicate(S, cor(gen.gauss.cop(r, n))[1, 2])
               }, 
               r = r, S = S)
boxplot(res, xlab = "Sample size", ylab = "Correlation")
abline(h = r, col = "red")

введіть тут опис зображення введіть тут опис зображення введіть тут опис зображення


3
Загальний метод генерації корельованих багатоваріантних розподілів із заданими граничними розподілами називається копулою .
whuber

@whuber, використання копули дозволяє задати структуру залежності між випадковими змінними. Проблема полягає в тому, що на кореляцію (Person) впливає як структура залежності, так і маржа. Отже, кожен вибір маржин вимагатиме відповідного вибору параметрів копули, не кажучи вже про те, що деяких рівнів кореляції просто неможливо досягти за заданими полями (наприклад, дивіться тут ). Якщо вам відомо про метод, який дозволяє «контролювати» рівень кореляції для будь-якого вибору меж, я б хотів про це знати.
QuantIbex

Дякую @QuantIbex. Але я не розумію, чому "а) означає, що коефіцієнт кореляції rho та (Пірсона) Спірмена для випадкових величин зі стандартними однаковими полями приблизно великий у великій вибірці"
Onturenio

2
Quantlbex, все що вам потрібно - це створити безперервний шлях копул від нижньої до верхньої межі Фреше-Гоффдінга. Для ідентичних крайових коефіцієнтів коефіцієнт кореляції буде неперервною функцією з цього шляху в інтервал . Мій "швидкий і брудний" приклад в коментарі до питання - це один такий шлях, але очевидно, що є багато інших: копули дають вам найбільш повний, найзагальніший спосіб створення та опису таких шляхів. Це свідчить про те, що початкове питання (грубо) недостатньо визначене: воно повинно визначити додаткові критерії для вирішення. [-1,1]
whuber

1
@Quantibex Я зважився на додавання речення, яке вказує на те, що ваша gen.gauss.copфункція буде працювати для більш ніж двох змінних з (тривіальним) налаштуванням. Якщо додаток вам не подобається або ви хочете викласти його по-іншому, будь ласка, поверніть або змініть за потребою.
Glen_b -Встановіть Моніку

0

u1U(0,1)u1w1U(0,1)I=1u1w2U(0,1)I=0u1U(0,1)u2

E(u1u2)=E[Iw1+(1I)w2][Iw1+(1I)w3]

Я(Я-1)=0Я2=Я(1I)2=(1I)I01Iw

E(u1u2)=E(I)E(w12)+E(1I)E(w2)E(w3) =pE(w12)+(1p)/4

V(w1)=1/12E(w12)=1/3E(u1u2)=p/12+1/4cov(u1u2)=p/12V(u1)=V(u2)=1/12cor(u1,u2)=p


0

(u1,u2)=Iw1+(1I)(w2,w3)w1,w2,w3U(0,1)Ipu1u2U(0,1)pk

(u1,u2)=I(w1,1w1)+(1I)(w2,w3)p


Чи можете ви додати короткий доказ, чому це працює?
Лаконічний

у1=ш1
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.