4


1

ユーザーは、var / covar行列内のすべての変数ペア間の相関に、一意で重要な上限/下限を課したいと考えています。

たとえば、すべての変数が0.9である分散行列が必要です。 |rho(x_i,x_j)| > 0.6, rho(x_i,x_j) being the correlation between 変数x_iとx_j。

ありがとう。

'' '' '

わかりました、速いの何か

'' '' '

元のログインを失ったので、新しいログインで質問を再投稿します。 前の繰り返し次の回答を得ました

*疑似乱数を意味します。これは_semi_ randomの正しい用語です - Robert Gould

*良い点ですが、私は彼が準疑似乱数を意味していると思います(疑似はコンピュータの乱数について話すときに仮定されます:-p)

*「相関」とは、「共分散」を意味しますか? - スバンテ

*いいえ、私は本当に相関を意味します。 すべての相関が自明な境界よりも厳密になるように、正定行列を生成します。 - vak

*私の答えを見てください。 標本の相関は指定された範囲内にあると主張するのですか、それとも標本を生成する母集団の相関のみに属するのですか。 私はあなたの問題が前者であればうまくいくかもしれないという考えを提案します。 - 木のチップ

  • woodship:いいえ、あなたの解決策がうまくいかないことを恐れています、私の答えを最初の脅威で見てください(上記リンク)。 ありがとう。

4 Answer


2


これが元のスレッドでの私の答えに対するあなたの返答です。

「人に来て、もっと簡単なものがなければならない」

すみませんが、ありません。 宝くじに当選したいだけでは不十分です。 カブスがシリーズに勝つことを要求するだけでは不十分です。 また、数学的な問題に対する解決策を要求しただけで、突然それが簡単であることを見つけることもできません。

指定された範囲内のサンプルパラメータを用いて擬似乱数偏差を生成する問題は、少なくとも偏差が何らかの意味で真に擬似乱数であることである場合、自明ではない。 範囲によっては、運が良いかもしれません。 棄却計画を提案しましたが、それが良い解決策になる可能性は低いとも述べました。 相関関係に多くの次元と狭い範囲がある場合、成功の可能性は低くなります。 サンプルサイズも重要です。これは、結果として得られる相関のサンプル分散を左右するためです。

あなたが本当に解決策を望んでいるなら、あなたは座って目標を明確にそして正確に指定する必要があります。 名義指定の相関構造を持つが相関の厳密な境界をもつ無作為標本が必要ですか。 目的の範囲を満たすサンプル相関行列はどれでも問題ありませんか。 分散も与えられていますか?


2


サイズM、単位分散のN個のランダムベクトルのセットを作成できます。 そしてそれらにランダムなベクトル(サイズNと単位分散)に特定の数kを掛けたものを加えます。 それから、それらすべてのベクトルの間の相関をとると、それは正定値行列になります。 Mが非常に大きい場合、相関分布には分散がなくなり、相関は次のようになります。k ^ 2 /(1 k ^ 2) Mが小さいほど、非対角要素の分布が広くなります。 あるいは、Mを非常に大きくして、「共通ベクトル」にそれぞれ異なるkを乗算することもできます。 これらのパラメーターを適切に操作すると、より細かくコントロールできるようになります。 これを行うためのMatlabコードを次に示します。

すべてクリア; 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 =コルコフ(Baux); hist(A(:)、100);


1


おそらく、この答えはそれを実用化するのに役立ちます。

非負定値のこの性質を持つ行列の1つのクラスは Wishart Distributionです。 そして、すべての非対角要素がいくつかの境界[l、u]の間にあるような〜W()のサンプルはあなたの質問に合うでしょう。 しかし、これが[l、u]の非対角行列を含むすべての正定行列の分布と同じであるとは思わない。

ウィキペディアのページには〜W()から計算するためのアルゴリズムがあります。

より簡単でハックな解決策(おそらくこれに近いでしょう)は:

(ただし、u> l、l> 0)

  1. Sigma = mean(l、u)である多変量法線から引きます。

  2. 次にサンプルを取り、_its_相関行列⇒ Cを計算します

  3. この行列はいくらかのランダムさ(ファズ)を持つでしょうが、それがどれくらいのファズを持つことになるかの数学は私が計算する私のリーグから少し外れています。 このC行列のoff-diagsの値は、mean(l、u)の平均を使って[-1,1]で囲まれます。 眼球によって、私はある種のベータ/指数関数を推測しています。 いずれにせよ、C内のoff diagの連続分布は、(l、u)= [-1,1]でなければ、それが振る舞わず、境界(l、u)の内側にないことを保証します。

  4. 手順1でサンプルの長さを増減することで、「ぼやけ」の量を調整できます。 Cのodd-diagsの分散量はサンプル数の平方根に比例することを私は賭けています(証明されていません)。

だからこれは本当に答えるのは簡単ではないようです!

他のポスターが示唆しているように、あなたはWishartから生成し、そしてあなたが望む特性が真であるものを保つことができます、しかしあなたは長い間サンプリングしているかもしれません! 0で定義されている人(それは一言ですか?)を除外すると、これは良い行列を生成するのにうまく機能するはずです。 しかし、これはoff-diagsが[l、u]にあるすべてのpos-def行列の真の分布ではありません。

上記で提案されたダムサンプリング方式のためのコード(R)

sigma1 < - 関数(n、sigma){out < - 行列(sigma、n、n)diag(out)< -  1 return(out)}

library(mvtnorm)sample_around_sigma < - 関数(size、upper、lower、tight = 500){#size:行列のサイズ#upper、lower:corr上の境界、> 0#tight:使用するサンプル数。 理想的には、この値は奇数ダイアグが[下限、上限]シグマ< -  sigma1(サイズ、平均(c(上限、下限)))になる可能性が非常に高いように計算されます:サイズサンプル< -  rmvnorm(n =タイト、平均=平均、シグマ=シグマ)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>要約(A [lower.tri(A)])。 var(A [lower.tri(A)]) 第1回 メジアン平均第3四半期 最大 0.3678 0.3808 0.3902 0.3947 0.4067 0.4366
[1]
0.0003949876


1


グレッグ、素晴らしいですね。 あなたのアイデアとウッドチップのアイデアを組み合わせることで、この代替アプローチが生まれます。 それは数学的にはとても汚いですが、うまくいくようです:

ライブラリ(MCMCpack)ライブラリ(MASS)p <-10 lb < - 。6 ub < - 。8 zupa < - 関数(θ){ac < - 行列(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(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 * mk < -  mvrnorm(10 * p、rep(0、p)、vari)pc <-sign(runif(p、-1,1))mf <-sweep(mk) 、2、pc、 "*")B <-cor(mf)の要約(abs(B [lower.tri(B)]))

基本的に、これは考え方です(上限= .8、下限= .6と言います)。これは十分に受け入れられる率で、100%ではありませんが、プロジェクトのこの段階で行います。