我正在尝试使用从相当复杂的数据框计算的信息来计算公式的参数。数据帧的格式(简化)
Id t_past ref Y
1 1 2.0 0.3
1 6 1.3 0.3
1 11 0.9 0.3
2 1 3.1 0.9
2 12 15.0 0.9
我一直在尝试使用dplyr来解决为每个Id估算Y的公式,然后将结果提供给optim()而没有任何成功。我收集optim()想要一个可以检查数据的数字矩阵?这是我到目前为止所尝试的:
library(dplyr)
optFn <- function(dat, par) {
sumFn <- function(r, p) {
sum <- 0
for(i in 1:length(r)) {
if(!is.na(r[i])) {
yf <- p[1] * exp(-p[2] * r[i])
sum <- sum + yf * 0.1
}
}
return(sum)
}
dat %>% group_by(Id) %>%
summarise(pred = sumFn(Ref, par), y = max(y)) %>%
select(pred,y) %>%
transmute(se = (pred - y)^2) -> SE
return(sum(SE$se))
}
# Create some test data
actualFn <- function(x) {
0.2 * exp( -0.3 * x) + 0.01 * rnorm(1)
}
hr <- seq(1, 60, by=6)
mp <- rep(hr, 100)
refVals <- seq(-17.5, 65.0, length.out=100)
ref <- as.vector(sapply(refVals, function (x) rep(x, 10)))
y <- actualFn(refVals)
y <- as.vector(sapply(y, function (x) rep(x, 10)))
IdVals <- seq(1, 100, by=1)
Id <- as.vector(sapply(IdVals, function (x) rep(x, 10)))
testDat <- data.frame(Id=Id, minutes_past=mp, Ref=ref, y=y)
# This doesn't work
#result <- optim(par = c(runif(1), runif(1)), fn=optFn, gr=NULL, data = testDat)
也许有一些更好的方法可以将公式的参数调整为给定的数据。有很多字段,其中一些我想尝试添加到公式中,以及每个Id的不均匀时间步长,所以如果我能帮助它,我不想将所有内容解压缩到数字矩阵中。
答案 0 :(得分:0)
如果您查看optim
的文档,它会告诉您如何使其正常工作。
fn
要最小化(或最大化)的函数,使用第一个参数 最小化的参数向量。它 应该返回一个标量结果。
在第一个参数之后需要提供给fn
的任何额外内容,您可以作为...
个参数之一传递。
在您的代码中,您为optFn
提供fn
。 optFn
的第一个参数是dat
,它不是“参数向量”。之后你传递了一个名为“数据”的论据。但是你的函数optFn
没有任何称为“数据”的参数。它只有“dat”。
所以请修正这两行:
optFn <- function(par, dat) {
和
result <- optim(par = c(runif(1), runif(1)), fn=optFn, gr=NULL, dat = testDat)
现在效果很好。
https://stat.ethz.ch/R-manual/R-devel/library/stats/html/optim.html