R:缺少 x 参数,没有默认值
R: x argument is missing, with no default
我正在使用 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)
我还创建了以下函数(“适应度”),它接受七个输入("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 之间)), , 执行一系列数据操作程序和 returns 一个“总”均值:
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.pdf and https://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
)
)
但是所有这些程序return都出现了类似的错误:
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")
有人可以告诉我我做错了什么吗?有可能解决这个问题吗?
谢谢
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_1
、split_2
和 split_3
变量,因为您在这些行中覆盖了它们。
split_1 = runif(1,0, 1)
split_2 = runif(1, 0, 1)
split_3 = runif(1, 0, 1)
我正在使用 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)
我还创建了以下函数(“适应度”),它接受七个输入("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 之间)), , 执行一系列数据操作程序和 returns 一个“总”均值:
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.pdf and https://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
)
)
但是所有这些程序return都出现了类似的错误:
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")
有人可以告诉我我做错了什么吗?有可能解决这个问题吗?
谢谢
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_1
、split_2
和 split_3
变量,因为您在这些行中覆盖了它们。
split_1 = runif(1,0, 1)
split_2 = runif(1, 0, 1)
split_3 = runif(1, 0, 1)