47 votos

¿Cómo puedo ajustar una regresión restringida en R para que los coeficientes totalicen = 1?

Veo una regresión limitada similar aquí:

Regresión lineal restringida a través de un punto especificado

pero mi requisito es ligeramente diferente. Necesito que los coeficientes sumen 1. En concreto, estoy haciendo una regresión de los rendimientos de 1 serie de divisas con respecto a otras 3 series de divisas, de modo que los inversores pueden sustituir su exposición a esa serie por una combinación de exposición a las otras 3, pero su desembolso de efectivo no debe cambiar, y preferiblemente (pero esto no es obligatorio), los coeficientes deben ser positivos.

He intentado buscar la regresión restringida en R y en Google pero con poca suerte.

0 votos

¿Estás seguro de que se trata de un problema de regresión restringida? Según leo la pregunta, usted busca una relación de la forma $y_4$ (una serie de Forex) = $\beta_1 y_1 + \beta_2 y_2 + \beta_3 y_3$ (más, supongo, un cuarto término que representa una tasa de rentabilidad segura vigente). Eso es independiente de la decisión de inversión. Si un cliente quiere invertir $c$ capital en $y_4$ utilizando $y_1$ , $y_2$ y $y_3$ como apoderados, entonces sólo invertirían $c\beta_1$ en $y_1$ , $c\beta_2$ en $y_2$ y $c\beta_3$ en $y_3$ . Eso no añade ninguna complicación especial a la regresión, ¿verdad?

0 votos

Lo hace porque si modelas esto encontrarás que B1 + B2 + B3 > 1 en muchos casos (o < 1 en otros). Esto se debe a que la divisa que se intenta replicar con los descriptores tendrá normalmente una volatilidad mayor o menor que las demás, por lo que la regresión le dará ponderaciones menores o mayores en respuesta. Esto requiere que el inversor no esté totalmente invertido, o que se apalanque, lo que no quiero. En cuanto a la tasa de rendimiento seguro no. Todo lo que estamos tratando de hacer es replicar la serie1 utilizando otras variables. Siendo un tipo de finanzas y no un estadístico tal vez me he equivocado en el nombre de mi pregunta.

0 votos

La razón de incluir un término para una tasa de rendimiento segura es que a veces tendrá un coeficiente no nulo. Es de suponer que los instrumentos seguros (los depósitos bancarios a un día) están al alcance de todo el mundo a bajo coste, por lo que cualquiera que lo ignore como componente de su cesta de inversión podría estar eligiendo combinaciones subóptimas. Ahora bien, si los coeficientes no suman la unidad, ¿qué importa? Simplemente invierte todo lo que quieras en las proporciones estimado por la regresión.

41voto

user8076 Puntos 16

Si he entendido bien, su modelo es $$ Y = \pi_1 X_1 + \pi_2 X_2 + \pi_3 X_3 + \varepsilon, $$ con $\sum_k \pi_k = 1$ y $\pi_k\ge0$ . Hay que minimizar $$\sum_i \left(Y_i - (\pi_1 X_{i1} + \pi_2 X_{i2} + \pi_3 X_{i3}) \right)^2 $$ con estas limitaciones. Este tipo de problema se conoce como programación cuadrática .

Aquí unas líneas de códigos R que dan una posible solución ( $X_1, X_2, X_3$ son las columnas de X los verdaderos valores de la $\pi_k$ son 0,2, 0,3 y 0,5).

> 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

No conozco ningún resultado sobre la distribución asintótica de los estimadores, etc. Si alguien tiene indicaciones, tendré curiosidad por conocerlas (si queréis puedo abrir una nueva pregunta al respecto).

0 votos

En realidad una pregunta rápida. ¿No debería minimizar la varianza en lugar de la suma? ¿No es eso lo que hace una regresión, minimizar la varianza del cuadrado de los errores?

6 votos

Esto es inteligente, Elvis, pero ¿no podrías lograr lo mismo simplemente reparametrizando la regresión? Por ejemplo, dejar que $Y = \alpha_1 X_1 + \alpha_2 X_2 + (1-\alpha_1-\alpha_2)X_3 +\varepsilon$ Eso equivale a $Y-X_3 = \alpha_1(X_1-X_3) + \alpha_2(X_2-X_3)+\varepsilon$ . Las estimaciones y los errores estándar de los $\pi_i$ son fáciles de calcular a partir de las estimaciones y la matriz var-covar de $\alpha_1$ y $\alpha_2$ .

7 votos

@whuber Sí, pero con datos más ruidosos, o con algunos de los $\pi_k$ cerca de $0$ , violarías fácilmente la restricción $\pi_k > 0$ que es la parte "dura" del problema.

12voto

stiduck Puntos 450

Como mencionó whuber, si usted está interesado sólo en las restricciones de igualdad, también puede simplemente usar la función estándar lm() reescribiendo su modelo:

\begin{eqnarray} Y&=&\alpha+\beta_1 X_1+\beta_2 X_2+\beta_3 X_3+\epsilon\\ &=& \alpha+\beta_1 X_1+\beta_2 X_2+(1-\beta_1-\beta_2) X_3+\epsilon\\ &=& \alpha + \beta_1( X_1-X_3) +\beta_2 (X_2-X_3)+ X_3+\epsilon \end{eqnarray}

Pero esto no garantiza que se cumplan las restricciones de desigualdad. En este caso, sin embargo, sí lo es, por lo que se obtiene exactamente el mismo resultado que utilizando el ejemplo de programación cuadrática anterior (poniendo la X3 a la izquierda):

X <- matrix(runif(300), ncol=3)
Y <- X %*% c(0.2,0.3,0.5) + rnorm(100, sd=0.2)
X1 <- X[,1]; X2 <-X[,2]; X3 <- X[,3]
lm(Y-X3~-1+I(X1-X3)+I(X2-X3))

0 votos

En el caso anterior de Matifou, ¿qué impide que el tercer coeficiente sea negativo? Por ejemplo, si los coeficientes óptimos para $\beta_1=0.75$ y $\beta_2=0.5$ conseguiríamos que $(1-\beta_1-\beta_2)=-0.25$ lo que implica aquí que nuestro tercer coeficiente es negativo y, por lo tanto, no se mantiene según nuestra regresión deseada.

3 votos

Gracias @A.S. por señalarlo. Efectivamente, esta solución sólo funciona para las restricciones de igualdad, no para las de desigualdad. He editado el texto en consecuencia.

2voto

Ken Puntos 41

Pregunta vieja pero como estoy enfrentando el mismo problema pensé en postear mis 2p...

Utilizar la programación cuadrática como sugiere @Elvis pero utilizando sqlincon de la practica paquete. Creo que la ventaja sobre quadrpog::solve.QP es una interfaz de usuario más sencilla para especificar las restricciones. (De hecho, lsqlincon es una envoltura alrededor de solve.QP ).

Ejemplo:

library(pracma)

set.seed(1234)

# Test data
X <- matrix(runif(300), ncol=3)
Y <- X %*% c(0.2, 0.3, 0.5) + rnorm(100, sd=0.2)

# Equality constraint: We want the sum of the coefficients to be 1.
# I.e. Aeq x == beq  
Aeq <- matrix(rep(1, ncol(X)), nrow= 1)
beq <- c(1)

# Lower and upper bounds of the parameters, i.e [0, 1]
lb <- rep(0, ncol(X))
ub <- rep(1, ncol(X))

# And solve:
lsqlincon(X, Y, Aeq= Aeq, beq= beq, lb= lb, ub= ub)

[1] 0.1583139 0.3304708 0.5112153

Los mismos resultados que los de Elvis:

library(quadprog)
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

EDITAR Para tratar de abordar el comentario de gung aquí hay una explicación. sqlincon emula a matlab's lsqlin que tiene una buena página de ayuda. Aquí están las partes relevantes con algunas ediciones (menores) mías:

X Matriz multiplicadora, especificada como una matriz de dobles. C representa el multiplicador de la solución x en la expresión C*x - Y. C es M por N, donde M es el número de ecuaciones, y N es el número de elementos de x.

Y Vector constante, especificado como un vector de dobles. Y representa el término constante aditivo en la expresión C*x - Y. Y es M por 1, donde M es el número de ecuaciones.

Aeq : Matriz de restricciones de igualdad lineal, especificada como una matriz de dobles. Aeq representa los coeficientes lineales en las restricciones Aeq*x = beq. Aeq tiene un tamaño de Meq por N, donde Meq es el número de restricciones y N es el número de elementos de x

beq Vector de restricciones de igualdad lineal, especificado como un vector de dobles. beq representa el vector constante en las restricciones Aeq*x = beq. beq tiene longitud Meq, donde Aeq es Meq-por-N.

lb Límites inferiores, especificados como un vector de dobles. lb representa los límites inferiores elementales en lb x ub.

ub Límites superiores, especificados como un vector de dobles. ub representa los límites superiores elementales en lb x ub.

1voto

John Olivas Puntos 11

Como entiendo su modelo, usted está buscando encontrar $$ \bar{\bar{x}} \cdot \bar{b} = \bar{y} $$ tal que $$ \sum \left [ \begin{matrix} \bar{b} \end{matrix} \right ] =1 $$

He descubierto que la forma más fácil de tratar este tipo de problemas es utilizar las propiedades asociativas de las matrices para tratar $\bar{b}$ en función de otras variables.

Por ejemplo $\bar{b}$ es una función de $\bar{c}$ a través del bloque de transformación $\bar{\bar{T_c}}$ . En su caso, $r$ a continuación es $1$ . $$ \bar{b} = \left [ \begin{matrix} k_0 \\ k_1 \\ k_2 \end{matrix} \right ] = \bar{\bar{T_c}} \cdot \bar{c} = \left [ \begin{matrix} 1 & 0 & 0 \\ 0 & 1 & 0 \\ -1 & -1 & 1 \end{matrix} \right ] \cdot \left[ \begin{matrix} k_0 \\ k_1 \\ r \end{matrix} \right ] $$ Aquí podemos separar nuestro $k$ nowns y $u$ nknowns. $$ \bar{c} = \left[ \begin{matrix} k_0 \\ k_1 \\ r \end{matrix} \right ] = \bar{\bar{S_u}} \cdot \bar{c_u} + \bar{\bar{S_k}} \cdot \bar{c_k} = \left[ \begin{matrix} 1 & 0 \\ 0 & 1 \\ 0 & 0 \end{matrix} \right] \cdot \left [ \begin{matrix} k_0 \\ k_1 \end{matrix} \right ] + \left [ \begin{matrix} 0 \\ 0 \\ 1 \end{matrix} \right ] \cdot r $$ Aunque podría combinar los diferentes bloques de transformación/separación, eso se vuelve engorroso con modelos más intrincados. Estos bloques permiten separar lo conocido de lo desconocido. $$ \bar{\bar{x}} \cdot \bar{\bar{T_c}} \cdot \left ( \bar{\bar{S_u}} \cdot \bar{c_u} + \bar{\bar{S_k}} \cdot \bar{c_k} \right ) = \bar{y} \\ \bar{\bar{v}} = \bar{\bar{x}} \cdot \bar{\bar{T_c}} \cdot \bar{\bar{S_u}} \\ \bar{w} = \bar{y} - \bar{\bar{x}} \cdot \bar{\bar{T_c}} \cdot \bar{\bar{S_k}} \cdot \bar{c_k} $$ Por último, el problema tiene una forma familiar. $$ \bar{\bar{v}} \cdot \bar{c_u} = \bar{w} $$

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X