gpt4 book ai didi

r - 使用以编程方式构造的公式有什么陷阱吗?

转载 作者:行者123 更新时间:2023-12-03 02:42:55 24 4
gpt4 key购买 nike

我想要遍历一个由潜在解释变量组成的长向量,依次对每个变量回归响应变量。而不是粘贴在一起模型公式,我正在考虑使用 reformulate()as demonstrated here .

下面的函数 fun() 似乎可以完成这项工作,拟合所需的模型。但请注意,它在其调用元素中记录构造公式对象的名称而不是它的值(value)

## (1) Function using programmatically constructed formula
fun <- function(XX) {
ff <- reformulate(response="mpg", termlabels=XX)
lm(ff, data=mtcars)
}
fun(XX=c("cyl", "disp"))
#
# Call:
# lm(formula = ff, data = mtcars) <<<--- Note recorded call
#
# Coefficients:
# (Intercept) cyl disp
# 34.66099 -1.58728 -0.02058

## (2) Result of directly specified formula (just for purposes of comparison)
lm(mpg ~ cyl + disp, data=mtcars)
#
# Call:
# lm(formula = mpg ~ cyl + disp, data = mtcars) <<<--- Note recorded call
#
# Coefficients:
# (Intercept) cyl disp
# 34.66099 -1.58728 -0.02058

我的问题:这有什么危险吗?这能成为一个例如,如果我想稍后应用更新预测或模型拟合对象的一些其他函数(可能来自其他环境)?

一个稍微尴尬的替代方案,不过,确实得到了记录调用权限是使用eval(substitute())。这在某种程度上是一种更安全的构造吗?

fun2 <- function(XX) {
ff <- reformulate(response="mpg", termlabels=XX)
eval(substitute(lm(FF, data=mtcars), list(FF=ff)))
}
fun2(XX=c("cyl", "disp"))$call
## lm(formula = mpg ~ cyl + disp, data = mtcars)

最佳答案

我总是犹豫是否声称在任何情况下涉及 R 环境和作用域的东西可能会产生影响,但是......经过更多探索,我上面的第一个用法确实看起来像安全。

事实证明,打印出来的调用有点转移注意力。

其他函数实际上使用的公式(以及由 formula()as.formula() 提取的公式)是存储在 fit 对象的 terms 元素中的值,it 获得正确的实际公式。 (terms 元素包含一个 "terms" 类的对象,它只是一个带有一堆附加属性的 "formula"。)

要查看我的问题中的所有提案和相关评论都存储相同的“公式”对象(取决于相关环境),请运行以下命令。

## First the three approaches in my post
formula(fun(XX=c("cyl", "disp")))
# mpg ~ cyl + disp
# <environment: 0x026d2b7c>

formula(lm(mpg ~ cyl + disp, data=mtcars))
# mpg ~ cyl + disp

formula(fun2(XX=c("cyl", "disp"))$call)
# mpg ~ cyl + disp
# <environment: 0x02c4ce2c>

## Then Gabor Grothendieck's idea
XX = c("cyl", "disp")
ff <- reformulate(response="mpg", termlabels=XX)
formula(do.call("lm", list(ff, quote(mtcars))))
## mpg ~ cyl + disp

要确认 formula() 确实从 fit 对象的 terms 元素导出其输出,请查看 stats:::formula。 lmstats:::formula.terms

关于r - 使用以编程方式构造的公式有什么陷阱吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17395724/

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