将模型参数传递给R';s predict()函数的鲁棒性

将模型参数传递给R';s predict()函数的鲁棒性,r,lexical-scope,dynamic-scope,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) 如何强制predict()使用原始b值而不是更改的值?或者,是否有某种方法可以控制predict()在何处查找变量,以便确保它获得所需的值?实际上,我不能将b作为newdata数据框的一部分,因为在我的应用程序中,b是一个参数向量

我试着用R来拟合线性模型并做出预测。我的模型包含一些不在数据帧中的常量边参数。以下是我所做工作的简化版本:

dat <- data.frame(x=1:5,y=3*(1:5))
b <- 1
mdl <- lm(y~I(b*x),data=dat)
如何强制
predict()
使用原始
b
值而不是更改的值?或者,是否有某种方法可以控制
predict()
在何处查找变量,以便确保它获得所需的值?实际上,我不能将
b
作为
newdata
数据框的一部分,因为在我的应用程序中,
b
是一个参数向量,其大小与新观测数据框的大小不同

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

eval(将值替换为引用的表达式

mdl <- eval(substitute(lm(y~I(b*x),data=dat), list(b=b)))

mdl
# Call:
# lm(formula = y ~ I(1 * x), data = dat)
# ...

mdl我们也可以使用
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  

mdl哇,这很好。唯一的缺点是它让
str(mdl)
更难看,因为它充满了替代值。但我现在可以接受,除非你能想出更好的方法?谢谢!@Paul我不确定你的意思是什么?因为有数字代替了“b”?还是别的什么?@Paul好的,试试
mdl@Paul你可能只想阅读
?本地的
文档(环境方面的东西可能会让人困惑,它会比我做得更好),但是
local
创建了一个新的环境,您可以在其中为表达式定义变量。例如,如果您改为
mdl,谢谢。在阅读文档后,我对
local()
产生的新环境在何处存在感到有点困惑。但我发现这段代码很有启发性:
my_env=new.env();mdl
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