2013-02-16 21 views
5

La funzione di ottimizzazione è progettata per gestire un argomento di funzione solo a quanto ho capito. Ma a volte una funzione può dipendere da diversi intervalli di input di variabili e parametri.Posso passare più argomenti alla funzione optimize() in R

ad esempio:

x.r<-rnorm(100) 
y<-function(x,p) -x^2+p*1/exp(x^3) 
optimize(y,upper=range(x.r)[2],lower=range(x.r)[1]) 

x.r. il dominio di x passato a y può cambiare da campione a campione. Invece di usare una x generica, voglio essere in grado di disegnare da molti domini di valori x.r per eseguire y su. C'è un modo per modificare la funzione di ottimizzazione in modo che io possa passare sia y, la funzione e x le sue variabili di dominio, sia i parametri di ottimizzazione p?

Con quanto sopra si ottiene un errore:

> optimize(y,upper=range(x.r)[2],lower=range(x.r)[1]) 
Error in p * 1 : 'p' is missing 

edit: da suggerimento di sotto (che ha un senso ... ma) ho provato.

x.r<-rnorm(100) 
p<-seq(-5,5,1) 
y<-function(x,p) -x^2+p*1/exp(x^3) 
optimize(y,upper=range(x.r)[2],lower=range(x.r)[1],p) 

risultati era: Errore in p * 1: 'p' manca

Inoltre,

> optimize(y,upper=range(x.r)[2],lower=range(x.r)[1],p,x.r) 
Error in optimize(y, upper = range(x.r)[2], lower = range(x.r)[1], p, : 
    invalid function value in 'optimize' 

altre idee?

modifica 2: per commenti sotto un ciclo funzionerebbe, ma sembra un modo strano per avvicinarsi. Non sono sicuro che sia in grado di prendere in modo univoco il dominio x.r.

x.r<-rnorm(100) 
p<-seq(-5,5,1) 
y<-function(p=p,x=x.r) -x^2+p*1/exp(x^3) 
for(v in p){ 
print(optimize(y,upper=range(p)[2],lower=range(p)[1],p=v))} 

> for(v in p){ 
+ print(optimize(y,upper=range(p)[2],lower=range(p)[1],p=v))} 
$minimum 
[1] -4.999944 

$objective 
[1] -9.637547e+54 

$minimum 
[1] -4.999944 

$objective 
... 
+1

Provare qualcosa come 'optimize (y, upper = range (xr) [2], lower = range (xr) [1], p = some_variable)' l'idea è di aggiungere il parametro 'p' alla fine e passare ad esso qualsiasi variabile desiderata – iTech

+0

ho modificato per provarlo. Ho anche provato diverse varianti (inc.facendo p come il primo argomento a y, dal momento che ottimizza il primo argomento per impostazione predefinita). La chiave che sto cercando di ottenere è il passaggio di diversi domini x all'ottimizzazione. – pat

+0

dovresti aggiungere l'argomento come 'p = 3' ad esempio – iTech

risposta

3

io chiamo optimise sopra p

x.r <- rnorm(100) 
p <- seq(-5,5,1) 
y<-function(x,p) -x^2+ p/exp(x^3) 
ll <- lapply(p,function(i) 
     optimize(y,upper=range(x.r)[2],lower=range(x.r)[1],p=i)) 

ll[[which.min(sapply(ll,'[[','minimum'))]] 

$minimum 
[1] -2.14628 

$objective 
[1] -98357.67 

Naturalmente se maximum = TRUE l'ultimo diventa

ll[[which.max(sapply(ll,'[[','maximum'))]] 
1

Un altro modo per uscire da questo, che funziona anche quando la cosa si sta chiamando non lo fa ti permette di specificare parametri con nome extra che vengono passati alla funzione è quello di creare una funzione che genera una funzione che genera una funzione con un dato p.

yp <- function(p){force(p);function(x){-x^2+p*1/exp(x^3)}} 
yp1=yp(1) 
yp2=yp(2) 

e ora i yp funzioni sono solo una funzione di x:

> yp1(0) 
[1] 1 
> yp2(0) 
[1] 2 

così il ciclo diventa:

x.r <- rnorm(100) 
pv <- seq(-5,5,1) 

ll <- lapply(pv,function(p){ 
     Y = yp(p) 
     optimize(Y,upper=range(x.r)[2],lower=range(x.r)[1]) 
     }) 

che è un loop sul pv vettore e mettendo ogni valore p per creare una funzione Y basata su tale valore. Nient'altro (tranne upper e lower) è passato a optimize.

Problemi correlati