【问题标题】:R: x argument is missing, with no defaultR:缺少 x 参数,没有默认值
【发布时间】:2021-09-17 15:05:53
【问题描述】:

我正在使用 R。我正在学习如何优化函数并估计这些函数的最大值或最小值。

例如,我创建了一些随机数据(“训练数据”):

#load libraries
library(dplyr)


# create some data for this example
a1 = rnorm(1000,100,10)
b1 = rnorm(1000,100,5)
c1 = sample.int(1000, 1000, replace = TRUE)
train_data = data.frame(a1,b1,c1)

我还创建了以下函数(“fitness”),它接受七个输入("random_1"(80 到 120 之间)、"random_2"(“random_1”和 120 之间)、"random_3"(85 到 120 之间) ,"random_4"(random_2 和 120 之间),"split_1"(0 和 1 之间),"split_2"(0 和 1 之间),"split_3"(0 和 1 之间)),执行一系列数据操作程序并返回一个“总计”的意思:

fitness <- function(random_1, random_2, random_3, random_4, split_1, split_2, split_3) {

    #bin data according to random criteria
    train_data <- train_data %>% mutate(cat = ifelse(a1 <= random_1 & b1 <= random_3, "a", ifelse(a1 <= random_2 & b1 <= random_4, "b", "c")))
    
    train_data$cat = as.factor(train_data$cat)
    
    #new splits
    a_table = train_data %>%
        filter(cat == "a") %>%
        select(a1, b1, c1, cat)
    
    b_table = train_data %>%
        filter(cat == "b") %>%
        select(a1, b1, c1, cat)
    
    c_table = train_data %>%
        filter(cat == "c") %>%
        select(a1, b1, c1, cat)
    
   
    
    #calculate  quantile ("quant") for each bin
    
    table_a = data.frame(a_table%>% group_by(cat) %>%
                             mutate(quant = quantile(c1, prob = split_1)))
    
    table_b = data.frame(b_table%>% group_by(cat) %>%
                             mutate(quant = quantile(c1, prob = split_2)))
    
    table_c = data.frame(c_table%>% group_by(cat) %>%
                             mutate(quant = quantile(c1, prob = split_3)))
    
    
    
    
    #create a new variable ("diff") that measures if the quantile is bigger tha the value of "c1"
    table_a$diff = ifelse(table_a$quant > table_a$c1,1,0)
    table_b$diff = ifelse(table_b$quant > table_b$c1,1,0)
    table_c$diff = ifelse(table_c$quant > table_c$c1,1,0)
    
    #group all tables
    
    final_table = rbind(table_a, table_b, table_c)
# calculate the total mean : this is what needs to be optimized
    mean = mean(final_table$diff)
    
    
}

作为健全性检查,我们可以验证此功能是否确实有效:

#testing the function at some specific input:

 a <- fitness(80,80,80,80,0.6,0.2,0.9)
 a
[1] 0.899

现在,使用以下关于 R 优化的参考资料(https://cran.r-project.org/web/packages/optimization/optimization.pdfhttps://cran.r-project.org/web/packages/optimization/vignettes/vignette_master.pdf),我正在尝试对这个函数执行一些常见的优化技术。

例如:

#load library
library(optimization)

带有初始猜测的 Nelder-Meade 优化:

optim_nm(fitness, start = c(80,80,80,80,0,0,0))

具有固定参数的 Nelder-Meade 优化:

optim_nm(fun = fitness, k = 2)

使用模拟退火进行优化:

ro_sa <- optim_sa(fun = fitness,
start = c(runif(7, min = -1, max = 1)),
lower = c(80,80,80,80,0,0,0),
upper = c(120,120,120,120,1,1,1),
trace = TRUE,
control = list(t0 = 100,
nlimit = 550,
t_min = 0.1,
dyn_rf = FALSE,
rf = 1,
r = 0.7
)
)

但所有这些过程都返回类似的错误:

Error: Problem with `mutate()` column `cat`.
i `cat = ifelse(...)`.
x argument "random_3" is missing, with no default
Run `rlang::last_error()` to see where the error occurred.
In addition: Warning message:
 Error: Problem with `mutate()` column `cat`.
i `cat = ifelse(...)`.
x argument "random_3" is missing, with no default
Run `rlang::last_error()` to see where the error occurred. 

这让我无法想象这些优化算法的结果:

#code for visualizations
plot(ro_sa)
 plot(ro_sa, type = "contour")

谁能告诉我我做错了什么?有可能解决这个问题吗?

谢谢

【问题讨论】:

    标签: r function optimization dplyr data-visualization


    【解决方案1】:

    start 值在函数中作为一个向量传递,因此将函数更改为 -

    fitness <- function(x) {
      #bin data according to random criteria
      train_data <- train_data %>% 
                     mutate(cat = ifelse(a1 <= x[1] & b1 <= x[3], "a", 
                                   ifelse(a1 <= x[2] & b1 <= x[4], "b", "c")))
    #.....
    #.....
    }
    

    那么你可以使用 -

    optim_nm(fitness, start = c(80,80,80,80,0,0,0))
    

    不过,我不确定 split_1split_2split_3 变量,因为您在这些行中覆盖了它们。

    split_1 =  runif(1,0, 1)
    split_2 =  runif(1, 0, 1)
    split_3 =  runif(1, 0, 1)
    

    【讨论】:

    • 感谢您的回答!我忘了从函数中删除“split_1”、“split_2”和“split_3”。我现在已经在我的问题中编辑了函数并删除了它们。
    • 我运行了代码——现在一切都运行了,但是代码产生了很多警告。也许函数的其余部分必须用以下格式编写? a1
    • 以后有时间可以看看这个问题吗? stackoverflow.com/questions/68275805/…b
    • 是的,无论您在哪里使用random_1,都需要替换为x[1],依此类推。我会看看其他问题。
    • 非常感谢 - 基于这个逻辑,我想我需要用 x[5] 替换“split_1”,用 x[6] 替换“split_2”,用 x[7] 替换“split_3”
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-12-09
    • 2020-07-04
    • 1970-01-01
    • 2021-07-30
    • 2020-01-14
    • 1970-01-01
    • 2021-03-10
    相关资源
    最近更新 更多