将模型参数稳健地传递给R的predict()函数

时间:2015-08-16 23:23:00

标签: r lexical-scope dynamic-scope

我正在尝试使用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是一个参数向量,其大小与新数据框的大小不同观察结果。

请注意,相对于我的实际用例,我已经大大简化了这一点,因此我需要一个强大的通用解决方案,而不仅仅是临时黑客攻击。

2 个答案:

答案 0 :(得分:3)

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)
# ...

答案 1 :(得分:0)

我们也可以使用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'引用它        参数除了包含在'。()'中的术语被评估        指定'where'环境。