Rの制約付き回帰:正の係数、合計が1でゼロ以外の切片


8

私は推定する必要があるモデルを有する、Σ K π K = 1  のための  K 1π K0  のための  K 1

Y=π0+π1X1+π2X2+π3X3+ε,
kπk=1 for k1πk0 for k1

エルビスの別の質問への答えはの場合のためにこれを解決。これがこのソリューションの彼/彼女のコードです:π0=0

   > library("quadprog");
   > X <- matrix(runif(300), ncol=3)
   > Y <- X %*% c(0.2,0.3,0.5) + rnorm(100, sd=0.2)
   > Rinv <- solve(chol(t(X) %*% X));
   > C <- cbind(rep(1,3), diag(3))
   > b <- c(1,rep(0,3))
   > d <- t(Y) %*% X  
   > solve.QP(Dmat = Rinv, factorized = TRUE, dvec = d, Amat = C, bvec = b, meq = 1)
   $solution
   [1] 0.2049587 0.3098867 0.4851546

   $value
   [1] -16.0402

   $unconstrained.solution
   [1] 0.2295507 0.3217405 0.5002459

   $iterations
   [1] 2 0

   $Lagrangian
   [1] 1.454517 0.000000 0.000000 0.000000

   $iact
   [1] 1

切片を推定できるように、このコードをどのように調整できますか?

私の割り当ての私のグループは、この回帰をまだ推定していないことに不満を感じているため、これはここでクロスポストされいます。他のフォーラム参加者が最初にそこに着いたら、ここでこの質問に答えます。

回答:


8

必要なのは、関連するマトリックスで少し遊んでみることだけです。切片をに追加しXます。

XX <- cbind(1,X)

D使用されている行列を再計算しますsolve.QP()(呼び出しを避けるために、これを直接操作することをお勧めしsolve()ます:

Dmat <- t(XX)%*%XX

d新しいで再計算XX

dd <- t(Y)%*%XX

切片に制約がないように見えるので(右?)、ゼロ列を追加して制約行列を変更します。

Amat <- t(cbind(0,rbind(1,diag(3))))

そして最後に:

solve.QP(Dmat = Dmat, factorized = FALSE, dvec = dd, Amat = Amat, bvec = b, meq = 1)

ステファンありがとう。ブートストラップを使用して、これらの係数推定の標準誤差を推定したいと思います。シリアル相関とヘテロロバストブートストラップを使用します。このアプローチの正当性についての意見はありますか(私が使用するブートストラップの正確なタイプではなく、一般的なブートストラップ)?

原則として、ここではブートストラップが正当であるように見えます...それが計算されたときの制約を念頭に置き、これらの制約を明確に伝えている限り、そうするつもりでしたね;-)?しかし、私はこれについての専門家とはほど遠いです。おそらくもっと有能な誰かがコメントできますか?
ステファンコラサ2012年

2
π1π

@whuber:良い点。もちろん、このことの他の目標は、係数が非負であるだけでなく、合計が1になることです。すべての係数が0から十分に離れているとします。合計制約のあるブートストラップは有効でしょうか?
ステファンコラサ

π=1π1+π2π1π21
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.