我在这里看到类似的约束回归:
但我的要求略有不同。我需要将这些系数相加为1。具体而言,我正在将1个外汇系列的收益与其他3个外汇系列的收益进行回归,以便投资者可以用对其他3个外汇系列的组合代替他们对该系列的风险敞口,但是现金支出一定不能改变,而且最好(但这不是强制性的),系数应该为正。
我试图在R和Google中搜索约束回归,但是运气不佳。
我在这里看到类似的约束回归:
但我的要求略有不同。我需要将这些系数相加为1。具体而言,我正在将1个外汇系列的收益与其他3个外汇系列的收益进行回归,以便投资者可以用对其他3个外汇系列的组合代替他们对该系列的风险敞口,但是现金支出一定不能改变,而且最好(但这不是强制性的),系数应该为正。
我试图在R和Google中搜索约束回归,但是运气不佳。
Answers:
如果正确地明白你的模型是 用Σ ķ π ķ = 1和π ķ ≥ 0。您需要尽量减少 Σ我(Ÿ 我 - (π 1 X 我1 + π 2 X 我2 + π 3 X 我
这里的ř码给人一种可能的解决方案的几个线(是的列,所述的真值π ķ是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()函数:
但这不能保证您的不平等约束得到满足!但是,在这种情况下,您得到的结果与上述二次编程示例完全相同(将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))
老问题了,但是由于我遇到了同样的问题,我想发布2p ...
通过@Elvis的建议,但使用使用二次规划sqlincon从pracma包。我认为,这样做的好处quadrpog::solve.QP
是可以使用更简单的用户界面来指定约束。(实际上lsqlincon
是的包装器solve.QP
)。
例:
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
与猫王的结果相同:
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
编辑为了尝试解决gung的评论,这里有一些解释。sqlincon模拟了matlab的lsqlin,它具有一个不错的帮助页面。这是我的一些(较小)编辑的相关信息:
X
乘数矩阵,指定为双精度矩阵。C表示表达式C * x-Y中解x的乘数。C为M×N,其中M为方程式数,N为x的元素数。
Y
常数向量,指定为双精度向量。Y表示表达式C * x-Y中的加法常数项。Y为M×1,其中M为方程式数。
Aeq
:线性相等约束矩阵,指定为双精度矩阵。Aeq表示约束Aeq * x = beq中的线性系数。Aeq的大小为Meq-by-N,其中Meq是约束的数量,N是x的元素数量
beq
线性相等约束向量,指定为双精度向量。beq表示约束Aeq * x = beq中的常数向量。beq的长度为Meq,其中Aeq为Meq-N。
lb
下限,指定为double的向量。lb表示元素下限,以lb≤x≤ub为单位。
ub
上限,指定为double的向量。ub表示元素上限,以lb≤x≤ub为单位。