gpt4 book ai didi

r - 在 lm lapply 调用列表中使用权重参数

转载 作者:行者123 更新时间:2023-12-04 07:19:54 24 4
gpt4 key购买 nike

这个问题在这里已经有了答案:





Error in calling `lm` in a `lapply` with `weights` argument

(2 个回答)


3年前关闭。




这是我的问题(虚构数据以便重现):

set.seed(42)
df<-data.frame("x"=rnorm(1000),"y"=rnorm(1000),"z"=rnorm(1000))
df2<-data.frame("x"=rnorm(100),"y"=rnorm(100),"z"=rnorm(100))
breaks<-c(-1000,-0.68,-0.01315,0.664,1000)
divider<-cut(df$x,breaks)
divider2<-cut(df2$x,breaks)
subDF<-by(df,INDICES=divider,data.frame)
subDF2<-by(df2,INDICES=divider2,data.frame)
reg<-lapply(subDF,lm,formula=x~.)
pre<-lapply(1:4,function(x){predict(reg[[x]],subDF2[[x]])})
lapply(1:4,function(x){summary(reg[[x]])$r.squared})

上面的代码工作正常。我正在做的是:根据 x 的值,我将 df 拆分为 4 个数据帧并对每个数据帧运行回归,以便能够预测其他数据集的值。数据帧的拆分是为了更好地预测,因为 x 的范围对实际数据有很大影响。

我想要做的是为回归添加一个权重参数,以更加重视最新数据。我的权重参数是:如果有 250 个数据,则为 weights<-0.999^seq(250,1,by=-1)。使用 42 的种子和之前的中断,所有 4 个维度都是 250。

当我尝试执行 reg<-lapply(subDF,lm,formula=x~.,weights=0.999^seq(250,1,by=-1)) 时,出现此错误:
Error in eval(expr, envir, enclos) : 
..2 used in an incorrect context, no ... to look in

这很奇怪,因为 lapply 有一个 ... 参数,这里用于 formula 但它不接受 weights

所以我真的不知道该怎么做才能添加这些权重。我应该在我的代码中更正什么,或者我应该(几乎)完全改变它以能够使用权重?

例如,为了使它(也许)更容易,我切断了中断,以便 4 个子集具有相同的维度,但理想情况下,即使 4 个子集的维度不同,答案也会起作用(因此中断为 breaks<-c(-1000,-0.75,0,0.75,1000)例如)

CrossValidated 上的 This 帖子有完全相同的问题,但没有有效的解决方案,因此对我没有帮助。

最佳答案

不幸的是,您已经亲 body 验了 R 中可以说是最严重的错误。即所谓的非标准评估 (NSE) 错误。

在对代码进行了一番挖掘之后,我想我已经找到了罪魁祸首。让我们一件一件来看:

首先让我们看看traceback() :

weights <- 0.999^seq(250,1,by=-1)

lapply(subDF, lm, formula=x~., weights=weights)
Error in eval(expr, envir, enclos) :
..2 used in an incorrect context, no ... to look in
> traceback()
8: eval(expr, envir, enclos)
7: eval(extras, data, env)
6: model.frame.default(formula = ..1, data = X[[1L]], weights = ..2,
drop.unused.levels = TRUE)
5: stats::model.frame(formula = ..1, data = X[[1L]], weights = ..2,
drop.unused.levels = TRUE)
4: eval(expr, envir, enclos)
3: eval(mf, parent.frame())
2: FUN(X[[1L]], ...)
1: lapply(subDF, lm, formula = x ~ ., weights = weights)

看起来问题发生在 model.frame.default 内部.那么,让我们来看看源代码。我不会发布整个源代码,但如果你输入 model.frame.default在控制台中,您将看到中间的某处:
extras <- substitute(list(...))
extranames <- names(extras[-1L])
extras <- eval(extras, data, env)

最后一行是失败的地方。第一行是所谓的 NSE,由 substitute 创建。 . substitute将创建所谓的 expression即,让我们说类似稍后要在 eval 内部进行评估(即创建)的对象之类的内容.正如您在 eval 中看到的那样, extras将在 data 中评估然后如果在 env 中没有找到.对于公式来说没问题,因为它是在数据中计算的, x~.会告诉 eval使用 data 中的所有列. weights虽然不在 data .因此, eval将在 env 中寻找它.但是什么是 env ?

显然, env是一个环境,在 model.frame.default 中创建在这一行:
env <- environment(formula$terms)

那么这是什么意思?让我们看另一个例子:
xtest <- function(x) {
new_func <- function(x) {
env <- environment(x)
print(env)
}
new_func(x)
}

> xtest(x~z)
<environment: R_GlobalEnv>

在上面的函数中,我尝试用更少的行复制 env将在 model.frame.default .如您所见, environment(formula)指向全局环境。

所以,它就在那里 env试图找到 ..2即第二个参数传入 ... (即 weights ),但因为没有 ...在全局环境中,您遇到错误。希望现在清楚了!

最佳解决方案,我会做的是使用 @Heroka 的答案来解决它(或者您可以在不使用 NSE 的情况下从头重写整个 model.frame.defaultlm,但我认为第一个更合理:))。

关于r - 在 lm lapply 调用列表中使用权重参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33479862/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com