Estoy trabajando con la salida de un modelo en el que hay estimaciones de parámetros que pueden no seguir las expectativas a priori. Me gustaría escribir una función que fuerce estas estimaciones de utilidad en línea con esas expectativas. Para hacer esto, la función debe minimizar la suma de la desviación cuadrada entre los valores iniciales y las nuevas estimaciones. Ya que tenemos expectativas a priori, la optimización debe estar sujeto a las siguientes limitaciones:Optimización con restricciones
B0 < B1
B1 < B2
...
Bj < Bj+1
Por ejemplo, las estimaciones de los parámetros primas a continuación están flipflopped para B2 y B3. Las columnas Delta
y Delta^2
muestran la desviación entre la estimación del parámetro original y el nuevo coeficiente. Estoy tratando de minimizar la columna Delta^2
. He codificado esto en Excel y mostrado cómo Solver de Excel optimizaría este problema proporcionando el conjunto de restricciones:
Beta BetaRaw Delta Delta^2 BetaNew
B0 1.2 0 0 1.2
B1 1.3 0 0 1.3
B2 1.6 -0.2 0.04 1.4
B3 1.4 0 0 1.4
B4 2.2 0 0 2.2
Después de leer a través ?optim
y ?constrOptim
, no soy capaz de asimilar cómo configurar esto en R. Estoy seguro de que estoy siendo un poco denso, pero podría usar algunos indicadores en la dirección correcta.
24/3/2012 - Recompensa adicional porque no soy lo suficientemente inteligente como para traducir la primera respuesta.
Aquí hay un código R que debería estar en el camino correcto. Suponiendo que las betas comienzan con:
betas <- c(1.2,1.3,1.6,1.4,2.2)
que desean minimizar la siguiente función tal que b0 <= b1 <= b2 <= b3 <= b4
f <- function(x) {
x1 <- x[1]
x2 <- x[2]
x3 <- x[3]
x4 <- x[4]
x5 <- x[5]
loss <- (x1 - betas[1])^2 +
(x2 - betas[2])^2 +
(x3 - betas[3])^2 +
(x4 - betas[4])^2 +
(x5 - betas[5])^2
return(loss)
}
Para demostrar que la función trabaja, la pérdida debe ser cero si pasamos las betas originales en :
> f(betas)
[1] 0
y relativamente grande, con algunas entradas al azar:
> set.seed(42)
> f(rnorm(5))
[1] 8.849329
y reducirse al mínimo en los valores que fue capaz de calcular en Excel:
> f(c(1.2,1.3,1.4,1.4,2.2))
[1] 0.04
A modo de reflejo, de hecho está describiendo un pedido regresión logística (http: //en.wikipedia.org/wiki/Ordered_logit). En el paquete 'MASS', la función' polr' puede resolver este tipo de problema. Hay un ejemplo en http://www.stat.washington.edu/quinn/classes/536/S/polrexample.html. Kenneth tren describe esta bien en su libro "Métodos discretos elección con simulación" – Andrie
@Andrie - tal vez sólo necesito mi café de la mañana, pero estoy teniendo un tiempo difícil conectar los puntos entre el ejemplo polr y lo que tengo que hacer aquí. Con 'polr()', ¿no es el objetivo predecir un conjunto de proporciones proporcionales? Tengo el libro de Ken Train en mi estante de libros (recogiendo polvo), así que también voy a darle vueltas. Gracias. – Chase
@Andrie +1 para el tren. Tenga en cuenta que también está disponible en línea en formato PDF. –