我想通过改变 OPTIM() 函数的优化结果来向现有数据框添加一个额外的列。当我将数据帧剥离到 1 行时代码有效,但当有 2 行时出现以下错误:
因
optim()
错误导致:
! optim 中的目标函数的计算结果为长度 2 而不是 1
library(tidyverse)
library(dbplyr)
hfcn <- function(b, D, U, U2, U3){
Din = ((1 - D)^-b - 1) / b
rsd_2 = ((U / (1 + b*Din*2)^(1/b) - U2)^2)^0.5
rsd_3 = ((U / (1 + b*Din*3)^(1/b) - U3)^2)^0.5
rst_tot = rsd_2 + rsd_3
return(rst_tot)
}
#################################
#### If I create dataframe A with a single row, the code works, but fails when there are 2 rows ####
# A <- data.frame(ID = c("A1")
# , U = c(28844)
# , D = c(0.7941582)
# , U2 = c(3417)
# , U3 = c(2465)
# )
#################################
A <- data.frame(ID = c("A1", "A2")
, U = c(72625, 28844)
, D = c(0.7785440, 0.7941582)
, U2 = c(7916, 3417)
, U3 = c(5409, 2465)
)
A2 <- mutate(A
, C = optim(par = 1.1
, hfcn
, D = A$D
, U = A$U
, U2 = A$U2
, U3 = A$U3
, method = "BFGS"
#, method = "L-BFGS-B"#, lower = 0, upper = 3
)[1]
)
mutate()
中的错误:
!计算 C = ...[]
时出现问题。
optim()
错误导致:
! optim 中的目标函数的计算结果为长度 2 而不是 1
回溯:
当我将数据库限制为单行时,我已经成功运行了代码。我可以通过函数独立运行两行,并使用 OPTIM() 改变和附加列,以便检查代码和函数输入。我怀疑我可能必须使用 purrr 的功能,但我在网上找不到任何可以帮助我解决这个问题的东西。
简答
您需要将这些值逐行传递给
optim
而不是整个向量:
A2 <- A %>%
rowwise() %>%
mutate(C = optim(par = 1.1
, hfcn
, D = D
, U = U
, U2 = U2
, U3 = U3
, method = "BFGS"
#, method = "L-BFGS-B"#, lower = 0, upper = 3
)[1]
) %>%
ungroup()
注意,在 tidyverse 中,当您引用一个变量时,您不需要使用
$
,因为引用被理解为来自数据框,除非另有说明。