Старый вопрос, но так как я столкнулся с той же проблемой, я подумал опубликовать свой 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
РЕДАКТИРОВАТЬ Чтобы попытаться ответить на комментарий гун, вот некоторые объяснения. sqlincon эмулирует от Matlab lsqlin , который имеет хорошую справочную страницу. Вот соответствующие биты с некоторыми (незначительными) моими правками:
X
Множительная матрица, указанная в виде матрицы двойников. C представляет множитель решения x в выражении C * x - Y. C представляет собой M-by-N, где M - количество уравнений, а N - количество элементов x.
Y
Постоянный вектор, указанный как вектор двойников. Y представляет собой аддитивный постоянный член в выражении C * x - Y. Y представляет собой M-by-1, где M - число уравнений.
Aeq
: Матрица ограничения линейного равенства, указанная как матрица значений типа double. Aeq представляет линейные коэффициенты в ограничениях Aeq * x = beq. Aeq имеет размер Meq-by-N, где Meq - количество ограничений, а N - количество элементов x.
beq
Вектор ограничения линейного равенства, заданный как вектор двойников. beq представляет постоянный вектор в ограничениях Aeq * x = beq. beq имеет длину Meq, где Aeq - это Meq-by-N.
lb
Нижние границы, указанные как вектор двойников. lb представляет элементарные нижние оценки в lb ≤ x ≤ ub.
ub
Верхние границы, указанные как вектор двойников. ub представляет верхние границы поэлементно в lb ≤ x ≤ ub.