2017-02-08 5 views
0

У меня есть функция, которая в настоящее время играет хорошо с rgenoud. Он имеет один параметр (xx), и rgenoud оптимизирует xx отлично.rgenoud - Как передать параметры функции?

Однако, я хотел бы добавить второй параметр к моей функции, который не был бы оптимизирован rgendoud. Например, я хотел бы, чтобы моя функция либо соответствовала модели с гауссовой связью, либо связью poisson, и чтобы указать, когда я вызываю rgenoud.

Любая идея? благодаря


редактировать: здесь минимальный рабочий пример того, что я имею в виду. Как бы вы получили последнюю работу?

adstock отражает тот факт, что телевизионная реклама должна влиять на количество котировок будущих недель.
Adstock [t] = Объявления [t] + rate * Объявления [t-1] + rate^2 * Объявления [t-2] + .... + rate^max_memory * Объявления [t-max_memory]

Мы хотим, чтобы rgenoud выяснил, какой курс и max_memory вернут модель с наилучшим соответствием. Наилучшая подгонка определяется как самая низкая RMSE.

set.seed(107) 

library(fpp) 
library(rgenoud) 

adstock_k <- function(x, adstock_rate = 0, max_memory = 12){ 
learn_rates <- rep(adstock_rate, max_memory+1)^c(0:max_memory) 
adstocked_advertising <- stats::filter(c(rep(0, max_memory), x), learn_rates, method="convolution") 
adstocked_advertising <- adstocked_advertising[!is.na(adstocked_advertising)] 
return(as.numeric(adstocked_advertising)) 
} 

getRMSE <- function(x, y) { 
    mean((x-y)^2) %>% sqrt 
} 

df <- data.frame(insurance) %>% 
    mutate(Quotes = round (Quotes*1000, digits = 0)) 
df$idu <- as.numeric(rownames(df))   

my_f <- function(xx){ 
    adstock_rate <- xx[1] 
    adstock_memory <- xx[2] 
    df.temp <- df %>% 
    mutate(adstock = adstock_k(TV.advert, adstock_rate/100, adstock_memory)) 
    mod <- lm(data=df.temp, Quotes ~ adstock) 
    getRMSE(df.temp$Quotes, predict(mod)) 
} 

domaine <- cbind(c(30,1), c(85, 8)) 
#this works 
min_f <- genoud(my_f, nvars = 2, max = F, pop.size=1000, wait.generations=10, Domains = domaine, data.type.int = T) 

#here I try to add a second parameter to the function. 
my_f2 <- function(xx,first_n_weeks=20){ 
    adstock_rate <- xx[1] 
    adstock_memory <- xx[2] 
    df.temp <- df %>% 
    filter(idu<= first_n_weeks) %>% 
    mutate(adstock = adstock_k(TV.advert, adstock_rate/100, adstock_memory)) 
    mod <- lm(data=df.temp, Quotes ~ adstock) 
    getRMSE(df.temp$Quotes, predict(mod)) 
} 

#this doesnt work 
min_f2 <- genoud(my_f2(first_n_week=10), nvars = 2, max = F, pop.size=1000, wait.generations=10, Domains = domaine, data.type.int = T) 
+0

Это довольно широкий. Просьба предоставить (возможно, упрощенную) версию вашей функции. – lmo

+0

Вы спрашиваете, как передать аргумент 'first_n_weeks' в' my_f2'? Если это так, вы просто придерживаетесь его в вызове 'genoud', например. 'genoud (my_f2, nvars = 2, max = F, pop.size = 1000, wait.generations = 10, Домены = domaine, data.type.int = T, first_n_weeks = 10)'. –

+0

@WeihuangWong Да, это именно то, что я пытался сделать - я сдался - спасибо! Если вы добавите ответ, я с радостью приму его – Zoltan

ответ

1

Включить аргумент в вызове, например genoud

genoud(my_f2, nvars = 2, max = F, pop.size=1000, wait.generations=10, Domains = domaine, data.type.int = T, first_n_weeks = 10) 
Смежные вопросы