【问题标题】:Using sapply (or apply) inside objective function for optim ; object in list element no longer recognized在 optim 的目标函数中使用 sapply(或 apply);列表元素中的对象不再被识别
【发布时间】:2015-03-02 23:57:57
【问题描述】:

我想使用基于元素列表的目标函数,每个元素都是在数据帧 (df) 上应用函数的结果((例如,函数是 df 的观测值“度量”的方差) )。也就是说,我有一个 dfs 列表。我自然想sapply我的函数超过dfs列表。

没有sapply,第一个块可以工作。它是针对单个 df,所以没有 sapply 命令,函数是 min.RSS(计算标准误差,我们将喜欢optim 以最小化)

#setup dfs
list_dat <- array(list(), dim=c(2,1))
list_dat[[1]] =data.frame(x=c(1,2,3,4,5,6,7,8), 
               y=c(1,3,5,6,8,12,15,19))
list_dat[[2]] =data.frame(x=c(1,2,3,4,5,6), 
                          y=c(1,3,5,6,8,12))
#define objective fn
min.RSS <- function(data, par) {
  with(data, sum((par[1] + par[2] * x - y)^2))
  }

#optimize : find minimum given starting values, feeding in the first element, namely the df 
result <- optim(c(0.5,0.5), min.RSS,   data = list_dat[[1]])

下面的不行,一个包含sapply的块,回来报错

eval(expr, envir, enclos) 中的错误:找不到对象“x”

谁能看看为什么?

#define new objective function based only on the first element, and optimize
min.RSS <- function(data, par) {
  sapply(list, function(data) with(data, sum((par[1] + par[2]* x - y)^2)))[[1]]
  }
result <- optim(c(0.5,0.5), min.RSS,   data = list_dat) # optimize, feeding in the list of (2) dfs

为了解释我不明白的内容,只需使用不带optim 的 sapply 即可按预期工作。我将参数 par[1] par[2] 更改为标量。也就是说,以下也有效

list2 <- sapply(list_dat, function(data) with(data, sum((1 + 2 * x - y)^2)))

【问题讨论】:

  • list 中的 sapply 应该是 list_dat?

标签: r apply mathematical-optimization sapply


【解决方案1】:
  1. list_dat 不是一个列表,它是一个列表数组。
  2. 您对min.RSS 的定义将data 定义为它的参数,但随后引用list
#  You don't really need to preallocate the list, but if you insist
list_dat <- vector(length=2, mode='list')
list_dat[[1]] =data.frame(x=c(1,2,3,4,5,6,7,8), 
                          y=c(1,3,5,6,8,12,15,19))
list_dat[[2]] =data.frame(x=c(1,2,3,4,5,6), 
                          y=c(1,3,5,6,8,12))


min.RSS <- function(list, par) {
    sapply(list, function(data) with(data, sum((par[1] + par[2]* x - y)^2)))[[1]]
}

 result <- optim(c(0.5,0.5), min.RSS,   list = list_dat)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-25
    • 2019-08-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多