繁体   English   中英

对目标函数使用sapply(或apply)进行优化; 列表元素中的对象不再被识别

[英]Using sapply (or apply) inside objective function for optim ; object in list element no longer recognized

我想使用基于元素列表的目标函数,每个元素都是在数据框(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)))
  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)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM