Ho un modello combinato complesso per il quale posso definire una probabilità in una funzione e ho bisogno di ottimizzare i parametri. Il problema è che i parametri vanno in tutte le direzioni se non sono limitati. Quindi, devo implementare una restrizione dei parametri, e quello proposto dal professore è che la somma dei valori dei parametri quadrati dovrebbe essere uguale a 1Ottimizzazione ristretta delle funzioni personalizzate in R
Ho giocato intorno con sia la funzione optim()
e nlm()
, ma Non posso davvero ottenere quello che voglio. La prima idea era di usare i parametri n-1 e calcolare l'ultimo dal resto, ma questo non funziona (come previsto).
Per illustrare, alcuni dati giocattolo e funzione riflette il problema nucleo di quello che voglio realizzare:
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)
Ciò comporta ovviamente in:
Error: (subscript) logical subscript too long
In addition: Warning message:
In sqrt(1 - sum(alpha^2)) : NaNs produced
Chiunque un'idea su come attuare restrizioni sui parametri nei processi di ottimizzazione?
PS: Sono consapevole del fatto che questo codice di esempio non ha alcun senso. È solo a scopo dimostrativo.
Modifica: Risolto! - Vedi la risposta di Mareks.
Hai provato 'constrOptim'? – James
@James, l'ho guardato qualche tempo fa, ma non sono riuscito a trovare un modo per tradurre il nostro vincolo in un modo fattibile. Lo guarderò di nuovo, grazie per il puntatore. Una delle cose è anche che -afaik- constrOptim è ancora più lento dell'ottimismo e abbiamo già seri problemi di prestazioni con il codice. –
Quanti parametri? –