Вопрос по matrix, statistics, linear-algebra, math – как генерировать псевдослучайную положительно определенную матрицу с ограничениями на недиагональные элементы?

4

Пользователь хочет наложить уникальную, нетривиальную верхнюю / нижнюю границу для корреляции между каждой парой переменной в матрице var / covar.

Например: я хочу матрицу отклонений, в которой все переменные имеют 0,9 & gt; | Rho (x_i, x_j) | & GT; 0.6, rho (x_i, x_j) - корреляция между переменными x_i и x_j.

Благодарю.

Хорошо, что-то быстрого и грязного решения было найдено, но если кто-то знает о болееexact способ добраться туда, это будет приветствоваться.

Я потерял свой первоначальный логин, поэтому я пересылаю вопрос под новым логином. Предыдущая итерация получил следующий ответ

* Вы имеете в виду псевдослучайный, это правильная терминология дляsemi случайный & # x2013; Роберт Гулд

* Хороший вопрос, но я думаю, что он имел в виду полупсевдослучайный (псевдослучайный характер, когда речь идет о компьютерной случайности :-p) & # x2013; Фортран

* Под "корреляцией" подразумевается ли "ковариация"? & # X2013; Сванте

* нет, я действительно имею в виду корреляцию. Я хочу создать положительно определенную матрицу, такую, чтобы все корреляции имели более жесткие, чем тривиальные границы. & # X2013; вак

* Смотри мой ответ. Вы настаиваете, чтобы выборочные корреляции лежали в указанных пределах, или только корреляции совокупности, которые генерируют выборку? Я предлагаю идею, которая может сработать, если ваша проблема - первая. & # X2013; щепки

* woodship: нет, я боюсь, что ваше решение не будет работать, пожалуйста, смотрите мой ответ в оригинальной угрозе (ссылка выше). Благодарю.

Ваш Ответ

4   ответа
2

"Давай люди, должно быть что-то попроще"

Я извиняюсь, но это не так. Желания выиграть в лотерею недостаточно. Требовать, чтобы новички выиграли серию, недостаточно. Также вы не можете просто требовать решения математической задачи и вдруг обнаружите, что это легко.

Проблема генерирования псевдослучайных отклонений с параметрами выборки в указанном диапазоне является нетривиальной, по крайней мере, если отклонения должны быть действительно псевдослучайными в каком-либо смысле. В зависимости от диапазона, одному может повезти. Я предложил схему отказа, но также заявил, что это вряд ли будет хорошим решением. Если в корреляциях много измерений и узких диапазонов, то вероятность успеха мала. Также важным является размер выборки, так как он будет определять дисперсию выборки результирующих корреляций.

Если вы действительно хотите найти решение, вам нужно сесть и указать свою цель, четко и точно. Вам нужна случайная выборка с номинальной заданной структурой корреляции, но строгими границами для корреляций? Будет ли удовлетворительной любая выборочная корреляционная матрица, которая удовлетворяет ограничению целей? Различия также даны?

Woodchips, Большое спасибо за ваш вклад. Позвольте мне уточнить, что строки, которые вы цитируете в моем ответе, касаются подхода QP, который вы предложили в конце своего поста, а не схемы отказа. Схема отклонения, которую вы предлагаете, является немного хитрой, потому что я не уверен, что перед наложением на собственные значения (помимо очевидного факта, что они должны быть положительными), есть идея? Тиа vak
PS: Вудшип, возможно, мой ответ на ваш первоначальный вклад содержит больше аргументов и аргументов, чем цитируемая вами строка. Я постарался рассмотреть каждое ваше предложение конструктивным образом, просто надеюсь, что я не выглядел неуважительно или что-то в этом роде. Лучший, vak
& quot; Хотите ли вы случайную выборку с номинальной заданной структурой корреляции, но строгими границами для корреляций? & quot; да "Будет ли удовлетворительной любая выборочная матрица корреляции, которая удовлетворяет ограничению целей?" да & quot; Различия также даны? & quot; это не имеет значения. Это строго о матрице корреляции vak
1

мы куда-то добираемся. Комбинируя вашу идею с древесной щепой, вы получаете этот альтернативный подход. Это математическиvery грязно но похоже на работу

library(MCMCpack)
library(MASS)
p<-10
lb<-.6
ub<-.8
zupa<-function(theta){
    ac<-matrix(theta,p,p)
    fe<-rwish(100*p,ac%*%t(ac))
    det(fe)
}
ba<-optim(runif(p^2,-10,-5),zupa,control=list(maxit=10))
ac<-matrix(ba$par,p,p)
fe<-rwish(100*p,ac%*%t(ac))
me<-mvrnorm(p+1,rep(0,p),fe)
A<-cor(me)
bofi<-sqrt(diag(var(me)))%*%t(sqrt((diag(var(me)))))
va<-A[lower.tri(A)]
l1=100
while(l1>0){
    r1<-which(va>ub)
    l1<-length(r1)
    va[r1]<-va[r1]*.9
}
A[lower.tri(A)]<-va
A[upper.tri(A)]<-va
vari<-bofi*A
mk<-mvrnorm(10*p,rep(0,p),vari)
pc<-sign(runif(p,-1,1))
mf<-sweep(mk,2,pc,"*")
B<-cor(mf)
summary(abs(B[lower.tri(B)]))

По сути, это идея (скажем, верхняя граница = 0,8, а нижняя граница = 0,6), она имеет достаточно хорошую степень приемлемости, которая не равна 100%, но она будет достаточной на данном этапе проекта.

Какова была цель для этого конкретного пробега? где здесь верхняя и нижняя границы?
2

ой дисперсией. И добавить к ним случайный вектор (размер N и единичная дисперсия), умноженный на определенное число k. Затем вы берете корреляцию между всеми этими векторами, которая будет положительно определенной матрицей. Если M очень большое, тогда не будет никакой дисперсии в распределении корреляции, и корреляция будет: k ^ 2 / (1 + k ^ 2). Чем меньше М, тем шире распределение недиагональных элементов. В качестве альтернативы, вы можете позволить M быть очень большим и умножить «общий вектор». на разные к каждому. Вы можете получить более жесткий контроль, если будете правильно играть с этими параметрами. Вот код Matlab для этого:

clear all;
vecLarg=10;
theDim=1000;
corrDist=0*randn(theDim,1);
Baux=randn(vecLarg,theDim)+  (corrDist*randn(1,vecLarg))'+(k*ones(theDim,1)*randn(1,vecLarg))'  ;
A=corrcoef(Baux);
hist(A(:),100);
1

Одним классом матриц, обладающим этим свойством неотрицательной определенности, являетсяWishart Distribution, А сэмплы из ~ W () такие, что все недиагональные записи находятся между границами [l, u], будут соответствовать вашему вопросу. Однако я не верю, что это то же самое, что и распределение всех положительно определенных матриц с недиагоналями в [l, u].

На странице википедии есть алгоритм вычисления из ~ W ().

Более простое хакерское решение (возможно, приближающееся к этому) заключается в следующем:

(учитывая, что u & gt; l и l & gt; 0)

draw from a multivariate normal where Sigma = mean(l,u). Then taking the sample, calculating its correlation matrix => C This matrix will have some randomness (fuzz), but the math of how much fuzz it will have is a little out of my my league to calculate. The values of the off-diags in this C matrix are bounded by [-1,1], with mean of mean(l,u). By eyeball, I'm guessing some sort of beta/exponential. In any case, that continuous distribution of the off diags in the C guarantees it won't behave and lie inside the bounds (l,u), unless (l,u) = [-1,1]. You can adjust the amount of "fuzz" by increasing / decreasing the length of the sample in step 1. I'd wager (unproven) that the amount of variance in C's odd-diags is proportional to the square-root of the number of samples.

Так что, кажется, нетривиально, чтобы действительно ответить!

Как и предлагали другие авторы, вы можете создать из Wishart, а затем сохранить те, в которых свойство, которое вы хотите, соответствует действительности, но вы можете пробовать в течение длительного времени! Если вы исключите тех, кто является 0-определенным (это слово?), То это должно хорошо работать для генерации хороших матриц. Однако это не является истинным распределением всех матриц pos-def, чьи недиагностики находятся в [l, u].

Code (in R) for dumb-sampling scheme proposed above

sigma1 <- function(n,sigma) {
    out <- matrix(sigma,n,n)
    diag(out) <- 1
    return (out)
}

library(mvtnorm)
sample_around_sigma <- function(size, upper,lower, tight=500) {
    #  size:  size of matrix
    #  upper, lower:  bounds on the corr, should be > 0
    #  tight:  number of samples to use.  ideally this
    #     would be calcuated such that the odd-diags will
    #     be "pretty likely" to fall in [lower,upper]
    sigma <- sigma1(size,mean(c(upper,lower)))
    means <- 0*1:size
    samples <- rmvnorm(n=tight, mean=means,sigma=sigma)
    return (cor(samples))
}

> A <- sample_around_sigma(5, .3,.5)
> A
          [,1]      [,2]      [,3]      [,4]      [,5]
[1,] 1.0000000 0.3806354 0.3878336 0.3926565 0.4080125
[2,] 0.3806354 1.0000000 0.4028188 0.4366342 0.3801593
[3,] 0.3878336 0.4028188 1.0000000 0.4085453 0.3814716
[4,] 0.3926565 0.4366342 0.4085453 1.0000000 0.3677547
[5,] 0.4080125 0.3801593 0.3814716 0.3677547 1.0000000
> 
> summary(A[lower.tri(A)]); var(A[lower.tri(A)])
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
 0.3678  0.3808  0.3902  0.3947  0.4067  0.4366 
[1] 0.0003949876
Я имел в виду «рисовать из многовариантной нормали со средним значением 0 (на самом деле не имеет значения), а сигма имеет форму: 1 на диагонали, среднее ([l, u]) на внеблоковых диаграммах» Я не помню термин для такой матрицы ... может быть, равная корреляция?
Спасибо, Грегг, что вы подразумеваете под "извлечением из многовариантной нормали, где сигма = среднее (l, u)". ? Кроме того, под средним (l, u) вы подразумеваете (u-l) / 2? Тиа, vak
Добавлено больше кода для очистки. среднее (l, u) :: (l + u) / 2

Похожие вопросы