2015-11-03 1 views
2

Je crée deux fonctions f (i) et f (j) et je veux trouver la valeur de i et j simultanément de sorte que la différence f (i) -f (j) soit minimisée. Cependant, en cours d'exécution du code ci-dessous, je reçois une erreur.Erreur lors de l'optimisation dans R

J'ai deux fonctions avec le paramètre i et j comme ci-dessous

bu1<- function(j){ 
sum(linkinc_lev1$gdp*(1/(1+ (linkinc_lev1$use_gro*(1+j/100)))) 
} 

bu1<- function(j){ 
sum(linkinc_lev2$gdp*(1/(1+ (linkinc_lev2$use_gro*(1+i/100)))) 
} 

Maintenant, je dois trouver la valeur de i et j simultanément de telle sorte que la différence des fonctions ci-dessus minimisés.

Je tentais comme

f1<- function(j,i) abs(bu1(j)-td1(i)) 
ans_lev1<-optimize(f1, lower=-100, upper=100), 

mais obtenir erreur Error in td1(i) : argument "i" is missing, with no default

Est-il possible en R pour minimiser les fonctions en fonction de deux paramètres?

+2

vous avez deux fonctions bu1 ... mais pas td1. Au fait, qu'est-ce que 'linkinc_lev1'? Un pot de confiture, un avion en laiton? –

+0

haha..apologies, la deuxième fonction est td1. linkinc_lev1 est juste un nom de base de données, shud a mentionné :) – user36176

+0

Est-ce que l'aide ci-dessous? et pouvez-vous «envoyer» vos données? –

Répondre

0

Oui, il y a, presque tous les optimiseurs fonctionnent sur des vecteurs de paramètres. Vous devez modifier votre fonction à quelque chose comme

f1<- function(param) abs(bu1(param[2])-td1(param[1])) 

dire que la fonction prend un seul argument « PARAM », et à l'intérieur de la fonction chercher les valeurs d'intérêt hors de lui.

Une note: si vous utilisez abs() vous vous retrouvez avec une fonction d'objectif non différentiable. Vous devez sélectionner un optimiseur capable de le gérer (SANN et Nelder-Mead, par exemple). Je préfère faire

f1 <- function(param) (bu1(param[2])-td1(param[1]))^2 

toujours la même solution mais maintenant différentiable, et vous pouvez l'alimenter à la plupart des optimiseurs.