Tengo un modelo combinado complicado para el que puedo definir una probabilidad en una función, y necesito optimizar los parámetros. El problema es que los parámetros van en todas las direcciones si no están restringidos. Por lo tanto, necesito implementar una restricción en los parámetros, y la propuesta por el profesor es que la suma de los valores de los parámetros cuadrados sea igual a 1.Optimización restringida de funciones personalizadas en R
He estado jugando con las funciones optim()
y nlm()
, pero Realmente no puedo obtener lo que quiero. La primera idea fue usar parámetros n-1 y calcular el último del resto, pero esto no funciona (como se esperaba).
Para ilustrar, algunos datos de juguete y la función que reflejan el problema central de lo que quiero lograr:
dd <- data.frame(
X1=rnorm(100),
X2=rnorm(100),
X3=rnorm(100)
)
dd <- within(dd,Y <- 2+0.57*X1-0.57*X2+0.57*X3+rnorm(100,0,0.2))
myfunc2 <- function(alpha,dd){
alpha <- c(alpha,sqrt(1-sum(alpha^2)))
X <- as.matrix(dd[,-4]) %*% alpha
m.mat <- model.matrix(~X)
mod <- glm.fit(m.mat,dd$Y)
Sq <- sum(resid(mod)^2)
return(Sq)
}
b <- c(1,0)
optim(b,myfunc2,dd=dd)
Esto se traduce obviamente en:
Error: (subscript) logical subscript too long
In addition: Warning message:
In sqrt(1 - sum(alpha^2)) : NaNs produced
Alguien una idea sobre cómo implementar restricciones sobre los parámetros en los procesos de optimización?
PD: Soy consciente de que este código de ejemplo no tiene ningún sentido. Es solo para fines de demostración.
Editar: ¡Resolvió! - Ver respuesta de Mareks.
¿Has probado 'constrOptim'? – James
@James, lo miré hace algún tiempo, pero no pude encontrar una manera de traducir nuestra limitación de una manera factible. Lo veré de nuevo, gracias al puntero. Una de las cosas también es que -afaik- constrOptim es incluso más lento que optim, y ya tenemos problemas graves de rendimiento con el código. –
¿Cuántos parámetros? –