使用从数据框计算的信息优化公式参数

时间:2015-11-16 16:37:54

标签: r

我正在尝试使用从相当复杂的数据框计算的信息来计算公式的参数。数据帧的格式(简化)

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的不均匀时间步长,所以如果我能帮助它,我不想将所有内容解压缩到数字矩阵中。

1 个答案:

答案 0 :(得分:0)

如果您查看optim的文档,它会告诉您如何使其正常工作。

  

fn

     

要最小化(或最大化)的函数,使用第一个参数   最小化的参数向量。它   应该返回一个标量结果。

在第一个参数之后需要提供给fn的任何额外内容,您可以作为...个参数之一传递。

在您的代码中,您为optFn提供fnoptFn的第一个参数是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