Я пытаюсь скопировать код, написанный изначально в MATLAB / Octave, на языке программирования R. Это ограниченная проблема оптимизации с использованием функции lsqlin , доступной в MATLAB и Octave. Последний бесплатный, поэтому я делюсь кодом Октава , который выглядит следующим образом:
pkg load optim
options = optimset('Display','off')
X = [1 2 8 11 -4 3; 2 8 6 1 10 -7; -10 -15 3 9 17 -11; -2 -3 -4 -5 -9 71]
y = [4;-1;5;7]
[b_reg,~,residual,~,~,lambda] = lsqlin(X, y, ones(1, size(X, 2)), 1, '', '', zeros(size(X, 2), 1), ones(size(X, 2), 1), [], options);
b_reg'
Это распечатывает расчетные коэффициенты:
ans =
0.00000 0.00000 0.00000 0.41553 0.11882 0.14305
Можно видеть, что матрица $ X $ не является полным рангом столбца, но функция оценивает 3 из 6 оцененных коэффициентов в ноль, так что число предикторов (3) меньше количества наблюдений (4).
Я попытался повторить то же самое в R следующим образом:
require(Matrix)
require(pracma)
require(quadprog)
X <- matrix(data = c(1, 2, 8, 11, -4, 3,
2, 8, 6, 1, 10, -7,
-10, -15, 3, 9, 17, -11,
-2, -3, -4, -5, -9, 71),
byrow = TRUE,
ncol = 6)
y <- matrix(data = c(4, -1, 5, 7), ncol = 1)
pracma::lsqlincon(C = X,
d = y,
A = ones(1, ncol(X)),
b = 1,
lb = zeros(ncol(X), 1),
ub = ones(ncol(X), 1))
Приведенный выше код R такой же, как и его эквивалент MATLAB / Octave. Однако R не может иметь дело с матрицей, которая не является полным рангом. Я получаю следующую ошибку:
Error in quadprog::solve.QP(Dmat, dvec, t(Amat), bvec, meq = meq) :
matrix D in quadratic function is not positive definite!
Поиск предложений о возможных альтернативах в среде программирования R для достижения почти идеальной репликации кода MATLAB.