稳健地将模型参数传递给 R 的 predict() 函数
passing model parameters to R's predict() function robustly
我正在尝试使用 R 来拟合线性模型并进行预测。我的模型包含一些不在数据框中的常量边参数。这是我正在做的事情的简化版本:
dat <- data.frame(x=1:5,y=3*(1:5))
b <- 1
mdl <- lm(y~I(b*x),data=dat)
不幸的是,模型对象现在遇到了一个危险的范围问题:lm()
不会将 b
保存为 mdl
的一部分,因此当 predict()
被调用时,它必须返回定义 b
的环境。因此,如果后续代码更改 b
的值,预测值也会更改:
y1 <- predict(mdl,newdata=data.frame(x=3)) # y1 == 9
b <- 5
y2 <- predict(mdl,newdata=data.frame(x=3)) # y2 == 45
如何强制 predict()
使用原始 b
值而不是更改后的值?或者,是否有某种方法可以控制 predict()
查找变量的位置,以便我可以确保它获得所需的值?在实践中,我不能将 b
作为 newdata
数据框的一部分,因为在我的应用程序中, b
是一个参数向量,其大小与 new 的数据框不同观察。
请注意,相对于我的实际用例,我已经大大简化了这一点,所以我需要一个强大的通用解决方案,而不仅仅是临时黑客。
eval(substitute
将值放入引用表达式
mdl <- eval(substitute(lm(y~I(b*x),data=dat), list(b=b)))
mdl
# Call:
# lm(formula = y ~ I(1 * x), data = dat)
# ...
我们也可以使用bquote
mdl <- eval(bquote(lm(y~I(.(b)*x), data=dat)))
mdl
#Call:
#lm(formula = y ~ I(1 * x), data = dat)
#Coefficients:
#(Intercept) I(1 * x)
# 9.533e-15 3.000e+00
根据?bquote
描述
‘bquote’ quotes its
argument except that terms wrapped in ‘.()’ are evaluated in the
specified ‘where’ environment.
我正在尝试使用 R 来拟合线性模型并进行预测。我的模型包含一些不在数据框中的常量边参数。这是我正在做的事情的简化版本:
dat <- data.frame(x=1:5,y=3*(1:5))
b <- 1
mdl <- lm(y~I(b*x),data=dat)
不幸的是,模型对象现在遇到了一个危险的范围问题:lm()
不会将 b
保存为 mdl
的一部分,因此当 predict()
被调用时,它必须返回定义 b
的环境。因此,如果后续代码更改 b
的值,预测值也会更改:
y1 <- predict(mdl,newdata=data.frame(x=3)) # y1 == 9
b <- 5
y2 <- predict(mdl,newdata=data.frame(x=3)) # y2 == 45
如何强制 predict()
使用原始 b
值而不是更改后的值?或者,是否有某种方法可以控制 predict()
查找变量的位置,以便我可以确保它获得所需的值?在实践中,我不能将 b
作为 newdata
数据框的一部分,因为在我的应用程序中, b
是一个参数向量,其大小与 new 的数据框不同观察。
请注意,相对于我的实际用例,我已经大大简化了这一点,所以我需要一个强大的通用解决方案,而不仅仅是临时黑客。
eval(substitute
将值放入引用表达式
mdl <- eval(substitute(lm(y~I(b*x),data=dat), list(b=b)))
mdl
# Call:
# lm(formula = y ~ I(1 * x), data = dat)
# ...
我们也可以使用bquote
mdl <- eval(bquote(lm(y~I(.(b)*x), data=dat)))
mdl
#Call:
#lm(formula = y ~ I(1 * x), data = dat)
#Coefficients:
#(Intercept) I(1 * x)
# 9.533e-15 3.000e+00
根据?bquote
描述
‘bquote’ quotes its argument except that terms wrapped in ‘.()’ are evaluated in the specified ‘where’ environment.