私は現在、rgenoudとうまくやっている機能を持っています。 1つのパラメータ(xx)を持ち、rgenoudはxxを完全に最適化します。rgenoud - 関数にパラメータを渡すには?
しかし、rgendoudによって最適化されない関数に2番目のパラメータを追加したいと思います。たとえば、関数にガウスリンクまたはポアソンリンクのモデルをフィットさせ、rgenoudを呼び出すときに指定することができます。
おかげ
編集:ここで私が何を意味するかの最小限の実施例です。最後の行をどうやって稼働させますか?
adstockは、テレビ広告が将来の週の見積もり数に影響するはずであるという事実を反映しています。 Adstock [t] = Ads [t] + rate * Ads [t-1] + rate^2 * Ads [t-2] + .... + rate^max_memory * Ads [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、Domains = domaine、data.type.int = T、first_n_weeks = 10)'となります。 –
@WeihuangWongはい、それはまさに私がやろうとしていたことです - 私はあきらめました - ありがとう!あなたが答えを加えたら、私はそれをうれしく受け入れます – Zoltan