係数total = 1になるようにRの制約付き回帰をどのように適合させるのですか?


36

同様の制約付き回帰がここにあります:

指定された点を通る制約付き線形回帰

しかし、私の要件は少し異なります。合計1の係数が必要です。具体的には、1つの外国為替シリーズのリターンを他の3つの外国為替シリーズに対して回帰しています。現金支出は変化してはならず、できれば(ただしこれは必須ではありません)、係数は正でなければなりません。

RとGoogleで制約付き回帰を検索しようとしましたが、ほとんど運がありません。


これは制約付きの回帰問題ですか?私は質問を読んで、フォームの関係を求める(1外国為替シリーズ)= β 1 Y 1 + β 2 Y 2 + β 3 Y 3(プラス、Iは、推定の実勢安全率を表す第4項をリターン)。それは投資決定とは無関係です。顧客が投資したい場合は、Cの中で資本をyの4使用してY 1Y 2、およびY 3をプロキシとして、その後、彼らは投資するC βをy4β1y1+β2y2+β3y3cy4y1y2y3における Y 1 C β 2における Y 2、および C β 3における Y 3。それは回帰に特別な複雑さを追加しませんか?cβ1y1cβ2y2cβ3y3
whuber

これをモデル化すると、多くの場合B1 + B2 + B3> 1(または他の場合は<1)が見つかるためです。これは、記述子を使用して複製しようとしている通貨のボラティリティが通常他の通貨よりも大きいか小さいため、回帰により、それに応じて重みが小さくなるか大きくなるためです。これには、投資家が完全に投資されないか、レバレッジが必要ですが、これは私は望んでいません。安全な収益率はありません。他の変数を使用してseries1を複製するだけです。統計学者ではなく、財務担当者であることは、おそらく私の質問の名前を間違っています。
トーマス・ブラウン

安全な収益率の項を含める理由は、係数がゼロでない場合があるためです。おそらく、安全な手段(一晩の銀行預金)は誰でも低コストで利用できるため、これを投資バスケットの構成要素として無視している人は次善の組み合わせを選択する可能性があります。さて、係数がユニティに追加されない場合、それでは何ですか?回帰によって推定された割合に、必要なだけ投資します。
whuber

正しい.....そのように単純です。ありがとう。今は少しばかげていると感じます(笑)。
トーマスブラウン

1
まったく愚かではありません。この質問をするだけでは、高度な思考が反映されます。私はあなたの質問に対する自分自身の理解をチェックして、あなたが効果的な答えを得たことを確認していました。乾杯。
whuber

回答:


35

私が正しく理解していれば、あなたのモデルは Σ kのπ 、K = 1π のk0。あなたは最小限に抑える必要がある Σ I Y I - π 1 X I 1 + π 2 X I 2 + π 3 X Iを

Y=π1X1+π2X2+π3X3+ε,
kπk=1πk0 これらの制約に従います。この種の問題は、二次計画法として知られています
i(Yi(π1Xi1+π2Xi2+π3Xi3))2

ここで可能な解決策を与えるRコードのいくつかの線(の列であり、真の値π kが 0.2、0.3及び0.5です)。X1,X2,X3Xπk

> 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

推定量などの漸近分布に関する結果は知りません。誰かがポインターを持っている場合、いくつかを取得したいと思います(これについての新しい質問を開くことができれば)。


実際に簡単な質問。合計ではなく分散を最小化すべきではありませんか?回帰が行うことは、誤差の二乗の分散を最小化することではありませんか?
トーマスブラウン

6
これは賢い、エルビスですが、回帰を再パラメータ化するだけで同じことを達成できませんでしたか?例えば、聞かせて との等価Y - X 3 = α 1X 1 - X 3+ α 2X 2X 3Y=α1X1+α2X2+(1α1α2)X3+ε。推定値と標準誤差 πは、私はの推定値とVAR-コバールマトリックスから計算することは簡単である α 1及び α 2YX3=α1(X1X3)+α2(X2X3)+επiα1α2
whuber

6
しかし、よりノイズの多いデータを持つ、またはいくつかのとはい@whuber に近い0、あなたは簡単に制約違反思いπ K > 0問題の「ハード」の部分です。πk0πk>0
エルビス

2
正の係数は、外貨を購入するよう指示します。負の係数は、それを売却するよう指示します。その通貨をまだ所有していない場合は、売却するために借りる必要があります(「売り切れ」)。無制限の借り入れは人々をトラブルに巻き込む可能性があるため、借り入れの量とその支払い方法に制約があります(「証拠金要件」と「資本キャリングコスト」と「時価評価」手続き)。したがって、借りることは可能ですが、市場の主要なプレーヤーを除いて、または大きな利点を与えない限り、しばしば避けられます。
whuber

2
すべての助けに感謝します。実際にFX市場全般についてコメントするために、空売りする前に株式を借りる必要がないため、株式や債券よりも簡単に空売りすることができます。分母と分子の通貨を単に反転させるだけです。したがって、たとえばEURUSDの販売とUSDEURの販売は、リスク部門の観点からはまったく同等の取引ですが、もちろんそれらは正反対のポジションです。彼らははるかに多くの重要な株式であり、方向の摩擦を心配する必要はありませんので、FXは定量トレーダーのためのような偉大な遊び場である理由だということ
トーマス・ブラウン

8

whuberで述べたように、等式制約のみに関心がある場合は、モデルを書き換えることで標準のlm()関数を使用することもできます。

Y=α+β1X1+β2X2+β3X3+ϵ=α+β1X1+β2X2+(1β1β2)X3+ϵ=α+β1(X1X3)+β2(X2X3)+X3+ϵ

ただし、これは不等式制約が満たされることを保証するものではありません!ただし、この場合はそうであるため、上記の2次プログラミングの例を使用した場合とまったく同じ結果が得られます(X3を左側に配置します)。

X <- matrix(runif(300), ncol=3)
Y <- X %*% c(0.2,0.3,0.5) + rnorm(100, sd=0.2)
X1 <- X[,1]; X2 <-X[,2]; X3 <- X[,3]
lm(Y-X3~-1+I(X1-X3)+I(X2-X3))

β1=0.75β2=0.5(1β1β2)=0.25

1
Thanks @A.S. for pointing this out. Indeed, this solution works only for the equality constraints, not the inequality ones. I edited the text accordingly.
Matifou

1

As I understand your model, you're seeking to find

x¯¯b¯=y¯
such that
[b¯]=1

I've found the easiest way to treat these sorts of problems is to use matrices' associative properties to treat b¯ as a function of other variables.

E.g. b¯ is a function of c¯ via the transform block Tc¯¯. In your case, r below is 1.

b¯=[k0k1k2]=Tc¯¯c¯=[100010111][k0k1r]
Here we can separate our knowns and unknowns.
c¯=[k0k1r]=Su¯¯cu¯+Sk¯¯ck¯=[100100][k0k1]+[001]r
While I could combine the different transform/separation blocks, that gets cumbersome with more intricate models. These blocks allow knowns and unknowns to be separated.
x¯¯Tc¯¯(Su¯¯cu¯+Sk¯¯ck¯)=y¯v¯¯=x¯¯Tc¯¯Su¯¯w¯=y¯x¯¯Tc¯¯Sk¯¯ck¯
Finally the problem is in a familiar form.
v¯¯cu¯=w¯

1

Old question but since I'm facing the same problem I thought to post my 2p...

Use quadratic programming as suggested by @Elvis but using sqlincon from the pracma package. I think the advantage over quadrpog::solve.QP is a simpler user interface to specify the constraints. (In fact, lsqlincon is a wrapper around solve.QP).

Example:

library(pracma)

set.seed(1234)

# Test data
X <- matrix(runif(300), ncol=3)
Y <- X %*% c(0.2, 0.3, 0.5) + rnorm(100, sd=0.2)

# Equality constraint: We want the sum of the coefficients to be 1.
# I.e. Aeq x == beq  
Aeq <- matrix(rep(1, ncol(X)), nrow= 1)
beq <- c(1)

# Lower and upper bounds of the parameters, i.e [0, 1]
lb <- rep(0, ncol(X))
ub <- rep(1, ncol(X))

# And solve:
lsqlincon(X, Y, Aeq= Aeq, beq= beq, lb= lb, ub= ub)

[1] 0.1583139 0.3304708 0.5112153

Same results as Elvis's:

library(quadprog)
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

EDIT To try to address gung's comment here's some explanation. sqlincon emulates matlab's lsqlin which has a nice help page. Here's the relevant bits with some (minor) edits of mine:

X Multiplier matrix, specified as a matrix of doubles. C represents the multiplier of the solution x in the expression C*x - Y. C is M-by-N, where M is the number of equations, and N is the number of elements of x.

Y Constant vector, specified as a vector of doubles. Y represents the additive constant term in the expression C*x - Y. Y is M-by-1, where M is the number of equations.

Aeq: Linear equality constraint matrix, specified as a matrix of doubles. Aeq represents the linear coefficients in the constraints Aeq*x = beq. Aeq has size Meq-by-N, where Meq is the number of constraints and N is the number of elements of x

beq Linear equality constraint vector, specified as a vector of doubles. beq represents the constant vector in the constraints Aeq*x = beq. beq has length Meq, where Aeq is Meq-by-N.

lb Lower bounds, specified as a vector of doubles. lb represents the lower bounds elementwise in lb ≤ x ≤ ub.

ub Upper bounds, specified as a vector of doubles. ub represents the upper bounds elementwise in lb ≤ x ≤ ub.

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