Regressão restrita em R: coeficientes positivos, soma a 1 e interceptação diferente de zero


8

Eu tenho o modelo que preciso estimar, com e .

Y=π0+π1X1+π2X2+π3X3+ε,
π k0  para  k 1kπk=1 for k1πk0 for k1

A resposta de Elvis para outra pergunta resolve isso no caso de . Aqui está o código desta solução:π0=0

   > 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

Como posso ajustar esse código para estimar uma interceptação?

Isso foi postado aqui porque meu grupo na minha tarefa está ficando irritado por eu ainda não ter estimado essa regressão. Responderei a essa pergunta aqui se / quando os outros participantes do fórum chegarem primeiro.

Respostas:


8

Você só precisa brincar um pouco com as matrizes envolvidas. Adicione a interceptação a X:

XX <- cbind(1,X)

Recalcule a Dmatriz usada solve.QP()(prefiro trabalhar diretamente com isso para evitar chamar solve():

Dmat <- t(XX)%*%XX

Recalcule dcom o novo XX:

dd <- t(Y)%*%XX

Altere a matriz de restrição adicionando uma coluna zero, pois você parece não ter nenhuma restrição na interceptação (certo?):

Amat <- t(cbind(0,rbind(1,diag(3))))

E finalmente:

solve.QP(Dmat = Dmat, factorized = FALSE, dvec = dd, Amat = Amat, bvec = b, meq = 1)

Obrigado Stephan. Eu quero usar um bootstrap para estimar os erros padrão dessas estimativas de coeficiente. Usarei uma correlação serial e um bootstrap hetero-robusto. Você tem alguma opinião sobre a legitimidade dessa abordagem (o bootstrap em geral, não o tipo exato de bootstrap que eu vou usar)?

Em princípio, parece que o bootstrap é legítimo aqui ... desde que você tenha em mente as restrições sob as quais foi calculada e comunique essas restrições claramente, mas você faria isso, não era ;-)? Mas estou longe de ser um especialista nisso; talvez alguém mais competente possa comentar?
Stephan Kolassa

2
Eu seria cauteloso em relação ao bootstrap se qualquer um dos estimados , for zero, porque essa solução está ao longo de um limite do espaço do parâmetro e as condições de regularidade usadas para justificar o bootstrap podem não se manter. Mas esse é precisamente o caso em que essa solução é necessária: afinal, se todos os forem diferentes de zero, possível usar o OLS para resolver esse problema. i 1 π iπii1πi
whuber

@ whuber: bom ponto. Obviamente, o outro objetivo disso é que os coeficientes não apenas sejam não negativos, mas também somam 1. Suponha que todos os coeficientes estejam bem longe de 0. O bootstrap com a restrição de soma seria válido?
Stephan Kolassa

A soma restringe os parâmetros a uma subvariedade do original (uma sem limites ou cantos). Portanto, ele não tem o mesmo efeito que impor uma condição de contorno e não deve afetar a estimativa, a inicialização, etc. Outra maneira de ver isso seria reduzir o número de parâmetros em um, digamos, reescrevendo e reescrevendo as condições de não negatividade como desigualdades somente em e . (As condições para forçar todos os valores a serem menores ou iguais a são desnecessárias.)π 1 π 2 1π3=1(π1+π2)π1π21
whuber
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.