同様の制約付き回帰がここにあります:
しかし、私の要件は少し異なります。合計1の係数が必要です。具体的には、1つの外国為替シリーズのリターンを他の3つの外国為替シリーズに対して回帰しています。現金支出は変化してはならず、できれば(ただしこれは必須ではありません)、係数は正でなければなりません。
RとGoogleで制約付き回帰を検索しようとしましたが、ほとんど運がありません。
同様の制約付き回帰がここにあります:
しかし、私の要件は少し異なります。合計1の係数が必要です。具体的には、1つの外国為替シリーズのリターンを他の3つの外国為替シリーズに対して回帰しています。現金支出は変化してはならず、できれば(ただしこれは必須ではありません)、係数は正でなければなりません。
RとGoogleで制約付き回帰を検索しようとしましたが、ほとんど運がありません。
回答:
私が正しく理解していれば、あなたのモデルは とΣ kのπ 、K = 1とπ のk ≥ 0。あなたは最小限に抑える必要がある Σ I (Y I - (π 1 X I 1 + π 2 X I 2 + π 3 X Iを
ここで可能な解決策を与えるRコードのいくつかの線(の列であり、真の値π kが 0.2、0.3及び0.5です)。X
> 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
推定量などの漸近分布に関する結果は知りません。誰かがポインターを持っている場合、いくつかを取得したいと思います(これについての新しい質問を開くことができれば)。
whuberで述べたように、等式制約のみに関心がある場合は、モデルを書き換えることで標準のlm()関数を使用することもできます。
ただし、これは不等式制約が満たされることを保証するものではありません!ただし、この場合はそうであるため、上記の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))
As I understand your model, you're seeking to find
I've found the easiest way to treat these sorts of problems is to use matrices' associative properties to treat as a function of other variables.
E.g. is a function of via the transform block . In your case, below is .
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.