重用R中内置的模型

重用R中内置的模型,r,models,R,Models,在R中构建模型时,如何保存模型规范,以便在新数据上重用?假设我在历史数据上建立了逻辑回归,但要到下个月才会有新的观察结果。最好的方法是什么 我考虑过的事情: 保存模型对象并在新会话中加载 我知道有些模型可以用PMML导出,但我还没有真正了解导入PMML的任何内容 简单地说,我试图了解当您需要在新会话中使用您的模型时,您会做些什么 提前感谢。重复使用模型预测新的观测结果 如果模型的计算成本不高,我倾向于在需要时重新运行的R脚本中记录整个模型构建过程。如果模型拟合涉及到随机元素,我会确保设置一个

在R中构建模型时,如何保存模型规范,以便在新数据上重用?假设我在历史数据上建立了逻辑回归,但要到下个月才会有新的观察结果。最好的方法是什么

我考虑过的事情:

  • 保存模型对象并在新会话中加载
  • 我知道有些模型可以用PMML导出,但我还没有真正了解导入PMML的任何内容
简单地说,我试图了解当您需要在新会话中使用您的模型时,您会做些什么

提前感谢。

重复使用模型预测新的观测结果 如果模型的计算成本不高,我倾向于在需要时重新运行的R脚本中记录整个模型构建过程。如果模型拟合涉及到随机元素,我会确保设置一个已知的随机种子

如果模型的计算成本很高,那么我仍然使用上面的脚本,但是使用
save()
将模型对象保存到和rda对象中。然后,我倾向于修改脚本,如果保存的对象存在,则加载它,如果不存在,则使用一个简单的
if()…else
子句重新安装模型,该子句围绕代码的相关部分

加载保存的模型对象时,请确保重新加载任何所需的包,尽管在您的情况下,如果logit模型通过
glm()
安装,则在R之后将不会再加载任何其他包

以下是一个例子:

> set.seed(345)
> df <- data.frame(x = rnorm(20))
> df <- transform(df, y = 5 + (2.3 * x) + rnorm(20))
> ## model
> m1 <- lm(y ~ x, data = df)
> ## save this model
> save(m1, file = "my_model1.rda")
> 
> ## a month later, new observations are available: 
> newdf <- data.frame(x = rnorm(20))
> ## load the model
> load("my_model1.rda")
> ## predict for the new `x`s in `newdf`
> predict(m1, newdata = newdf)
        1         2         3         4         5         6 
6.1370366 6.5631503 2.9808845 5.2464261 4.6651015 3.4475255 
        7         8         9        10        11        12 
6.7961764 5.3592901 3.3691800 9.2506653 4.7562096 3.9067537 
       13        14        15        16        17        18 
2.0423691 2.4764664 3.7308918 6.9999064 2.0081902 0.3256407 
       19        20 
5.4247548 2.6906722 
其中,
m1
是原始保存的模型配合,
~
是模型公式更改,在这种情况下意味着包括
~
左右两侧的所有现有变量(换言之,不对模型公式进行更改),
df
是用于拟合原始模型的数据框,扩展以包括新可用的观测值

以下是一个工作示例:

> set.seed(123)
> df <- data.frame(x = rnorm(20))
> df <- transform(df, y = 5 + (2.3 * x) + rnorm(20))
> ## model
> m1 <- lm(y ~ x, data = df)
> m1

Call:
lm(formula = y ~ x, data = df)

Coefficients:
(Intercept)            x  
      4.960        2.222  

> 
> ## new observations
> newdf <- data.frame(x = rnorm(20))
> newdf <- transform(newdf, y = 5 + (2.3 * x) + rnorm(20))
> ## add on to df
> df <- rbind(df, newdf)
> 
> ## update model fit
> m2 <- update(m1, . ~ ., data = df)
> m2

Call:
lm(formula = y ~ x, data = df)

Coefficients:
(Intercept)            x  
      4.928        2.187
但是,如果模型拟合涉及其他参数,如更复杂的模型拟合函数中的
'family'
'subset'
参数。如果模型拟合函数可用
update()
方法(这些方法适用于许多常见拟合函数,如
glm()
),则更新模型拟合的方法比提取和重用模型公式更简单


如果您打算在R中进行所有建模和未来预测,那么通过PMML或类似方法提取模型似乎没有多大意义。

如果您使用相同名称的数据帧和变量,您可以(至少对于
lm()
glm()
)在保存的模型上使用函数
update

Df <- data.frame(X=1:10,Y=(1:10)+rnorm(10))

model <- lm(Y~X,data=Df)
model

Df <- rbind(Df,data.frame(X=2:11,Y=(10:1)+rnorm(10)))

update(model)

Df好的,您可以始终“保存”模型公式,并在
data
参数中提供更新的数据。。。假设我正确地理解了你……嗯,你说的重复使用是什么意思?预测新的观察结果,或更新模型,使其适合使用新的观察结果加上旧的观察结果?@Gavin。我想使用我开发的模型来预测数据的新值,这些数据我还没有,也可能有一段时间没有。@Bitbert3好的,那么我的答案的开头部分就是我要做的。将模型对象保存到磁盘是完全可以接受的,但首先保存用于生成模型的R代码/脚本是很重要的,以便您的研究/建模是可复制的。+1如果您愿意拒绝编辑您的答案以适应我准备的任何答案…;-)@乔里斯可不是个婊子!;-)+1对于来自Meth的
update
,这是一个非常好的答案。我希望有人能策划出像这样的答案,并把它们作为一个教程。很好的答案。谢谢你给出的例子。正是我想要的。我想做+1000。。。非常感谢。
> set.seed(123)
> df <- data.frame(x = rnorm(20))
> df <- transform(df, y = 5 + (2.3 * x) + rnorm(20))
> ## model
> m1 <- lm(y ~ x, data = df)
> m1

Call:
lm(formula = y ~ x, data = df)

Coefficients:
(Intercept)            x  
      4.960        2.222  

> 
> ## new observations
> newdf <- data.frame(x = rnorm(20))
> newdf <- transform(newdf, y = 5 + (2.3 * x) + rnorm(20))
> ## add on to df
> df <- rbind(df, newdf)
> 
> ## update model fit
> m2 <- update(m1, . ~ ., data = df)
> m2

Call:
lm(formula = y ~ x, data = df)

Coefficients:
(Intercept)            x  
      4.928        2.187
> formula(m1)
y ~ x
> ## which can be used to set-up a new model call
> ## so an alternative to update() above is:
> m3 <- lm(formula(m1), data = df)
Df <- data.frame(X=1:10,Y=(1:10)+rnorm(10))

model <- lm(Y~X,data=Df)
model

Df <- rbind(Df,data.frame(X=2:11,Y=(10:1)+rnorm(10)))

update(model)