квадратичное c программирование на R с большим количеством параметров (ограничений), чем наблюдений - PullRequest
0 голосов
/ 01 апреля 2020

Я хочу запустить ограниченную линейную регрессию, чтобы коэффициенты были неотрицательными и суммировались в единицу. Обычно это можно сделать с помощью квадратичного c программирования. Однако у меня больше параметров (ограничений), чем наблюдений (p> n). Как я могу это сделать?

Это quadprog-решение работает только для проблем с n> p:

library(quadprog);
N <- 20
P <- 40
X <- matrix(runif(N*P), ncol=P)
btrue <- c(1,1,rep(0,(P-2)))
Y <- X %*% btrue + rnorm(N, sd=0.2)
C <- cbind(rep(1,P), diag(P))
b <- c(1,rep(0,P))
solve.QP(Dmat = t(X)%*%X, dvec = t(Y)%*%X , Amat = C, bvec = b, meq = 1)

1 Ответ

0 голосов
/ 07 апреля 2020

Вы можете сделать это, используя следующую модель:

min r'r
r = X'b - y
b >= 0
sum(b) = 1
r free

, где b - параметры для оценки, а r - невязки. Оба b и r являются переменными решения. Эта проблема всегда выпукла (т.е. Q = I всегда положительно определена), даже если n

Тем не менее, Quadprog может все еще не нравиться (я думаю, что ему нужна матрица строго по умолчанию, в отличие от большинства решателей QP). Исправьте это, изменив D на:

D = [ 0.0001*I  0  ]
    [ 0         I  ]

Код R может выглядеть следующим образом:

#
#
#  b = [b]  (P)
#      [r]  (N)
#
#  D =  [ 0 0 ] 
#       [ 0 I ]
#
#  d = [0]
#      [0]
#
#  A' =  [ 1' 0' ]
#        [ I  0  ]
#
# b0 = [1]
#      [0]
#


# fudge left upper sub matrix
D  = rbind( cbind( 0.0001*diag(P), matrix(rep(0,P*N),nrow=P,ncol=N)),
            cbind( matrix(rep(0,N*P),nrow=N,ncol=P), diag(N) ) 
           )
d = rep(0, P+N)

A = rbind( cbind( matrix(rep(1,P),nrow=1), matrix(rep(0,N),nrow=1)),
           cbind(diag(P),matrix(rep(0,P*N),nrow=P,ncol=N)))

b0 = rbind( matrix(c(1),nrow=1,ncol=1), matrix(rep(0,P),nrow=P,ncol=1))


solve.QP(Dmat = D, dvec = d , Amat = t(A), bvec = b0, meq = 1)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...