У меня есть функция, которая в настоящее время играет хорошо с 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)
Это довольно широкий. Просьба предоставить (возможно, упрощенную) версию вашей функции. – lmo
Вы спрашиваете, как передать аргумент '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)'. –
@WeihuangWong Да, это именно то, что я пытался сделать - я сдался - спасибо! Если вы добавите ответ, я с радостью приму его – Zoltan