1) CVXR Мы можем вычислить коэффициенты, используя CVXR напрямую, указав цель и ограничение. Мы предполагаем, что D является ответом, коэффициенты A и B должны быть равны 1, b [1] - это точка пересечения, а b [2], b [3] и b [4] - коэффициенты A, B и C.
library(CVXR)
b <- Variable(4)
X <- cbind(1, as.matrix(data[-4]))
obj <- Minimize(sum((data$D - X %*% b)^2))
constraints <- list(b[2] + b[3] == 1)
problem <- Problem(obj, constraints)
soln <- solve(problem)
bval <- soln$getValue(b)
bval
## [,1]
## [1,] 1.6428605
## [2,] -0.3571428
## [3,] 1.3571428
## [4,] -0.1428588
Цель - это остаточная сумма квадратов, которая равна:
soln$value
## [1] 0.07142857
2) pracma Мы также можем использовать пакет pracma для вычислениякоэффициенты. Мы указываем X-матрицу, вектор ответа, матрицу ограничений (в этом случае вектор, заданный в качестве третьего аргумента, рассматривается как матрица из одной строки) и правую часть ограничения.
library(pracma)
lsqlincon(X, data$D, Aeq = c(0, 1, 1, 0), beq = 1) # X is from above
## [1] 1.6428571 -0.3571429 1.3571429 -0.1428571
3) limSolve Этот пакет также может решать для коэффициентов регрессионных задач с ограничениями. Аргументы такие же, как и в (2).
library(limSolve)
lsei(X, data$D, c(0, 1, 1, 0), 1)
, что дает:
$X
A B C
1.6428571 -0.3571429 1.3571429 -0.1428571
$residualNorm
[1] 0
$solutionNorm
[1] 0.07142857
$IsError
[1] FALSE
$type
[1] "lsei"
Проверка
Мы можем проверить выше, используя lm
подход в другом ответе:
lm(D ~ I(A-B) + C + offset(B), data)
, дающий:
Call:
lm(formula = D ~ I(A - B) + C + offset(B), data = data)
Coefficients:
(Intercept) I(A - B) C
1.6429 -0.3571 -0.1429
Коэффициент I(A-B)
равен коэффициенту A
в исходной формулировке, и один минус - это коэффициентC
. Мы видим, что все подходы приводят к одинаковым коэффициентам.