Regresión restringida en R: coeficientes positivos, suma a 1 e intercepción no nula

8

Tengo el modelo que necesito estimar, con y .

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

La respuesta de Elvis a otra pregunta resuelve esto para el caso de . Aquí está su código de esta solución:π0 0=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

¿Cómo puedo ajustar este código para que pueda estimar una intercepción?

Esto se ha publicado aquí porque mi grupo en mi tarea está molesto porque aún no he estimado esta regresión. Contestaré esta pregunta aquí si / cuando los otros participantes del foro lleguen primero.

Comunidad
fuente

Respuestas:

8

Solo necesitas jugar un poco con las matrices involucradas. Agregue la intercepción a X:

XX <- cbind(1,X)

Vuelva a calcular la Dmatriz utilizada solve.QP()(prefiero trabajar directamente con esto para evitar llamar a solve():

Dmat <- t(XX)%*%XX

Recalcular dcon lo nuevo XX:

dd <- t(Y)%*%XX

Cambie la matriz de restricciones agregando una columna cero, ya que parece que no tiene restricciones en la intersección (¿verdad?):

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

Y finalmente:

solve.QP(Dmat = Dmat, factorized = FALSE, dvec = dd, Amat = Amat, bvec = b, meq = 1)
Stephan Kolassa
fuente
Gracias Stephan Quiero usar un bootstrap para estimar los errores estándar de estas estimaciones de coeficientes. Usaré una correlación serial y un arranque robusto heterogéneo. ¿Tiene alguna opinión sobre la legitimidad de este enfoque (el bootstrap en general, no el tipo exacto de bootstrap que voy a usar)?
En principio, parece que el bootstrap es legítimo aquí ... siempre y cuando tenga en cuenta las restricciones bajo las cuales se calculó y comunique estas restricciones claramente, pero iba a hacer eso, ¿no es así? Pero estoy lejos de ser un experto en esto; ¿Quizás alguien más competente pueda comentar?
Stephan Kolassa
2
Sería cauteloso con el bootstrap si alguno de los estimados πyo, yo1, son cero, porque esa solución se encuentra en un límite del espacio de parámetros y las condiciones de regularidad utilizadas para justificar el bootstrapping podrían no ser válidas. Pero ese es precisamente el caso donde se necesita esta solución: después de todo, si todo elπyoson distintos de cero, entonces uno podría usar OLS para resolver este problema.
Whuber
@whuber: buen punto. Por supuesto, el otro objetivo de esto es que los coeficientes no solo sean no negativos, sino que también sumen 1. Supongamos que todos los coeficientes están muy lejos de 0. ¿Sería válido el bootstrap con la restricción de suma?
Stephan Kolassa
La suma restringe los parámetros a un submanifold del original (uno sin límites ni esquinas). Por lo tanto, no tiene el mismo efecto que imponer una condición límite y no debe afectar la estimación, el arranque, etc. Otra forma de ver esto sería reducir el número de parámetros en uno, digamos reescribiendoπ3=1-(π1+π2) y reescribiendo las condiciones de no negatividad como desigualdades en π1 y π2solamente. (Condiciones para forzar que todos los valores sean menores o iguales que1son innecesarios.)
whuber