如何将R模型存储为文本?

时间:2014-02-25 08:36:29

标签: r save lm

发现了一个类似的问题here,但它没有填满。

我的问题分为2:

  1. 我想将一个“瘦身”版本的R lm()对象存储为DBMS中的文本。
  2. 我希望能够从我保存的文本对象中产生预测。
  3. “slim”我的意思是只有正确的数据量,predict()函数不会失败。我想存储模型因为学习有时需要花费很多时间,例如:

    lmFull <- lm(Volume~Girth+Height,data=trees)
    lmSlim <- lmFull
    lmSlim$fitted.values <- lmSlim$qr$qr <- lmSlim$residuals <- lmSlim$model <- lmSlim$effects <- NULL
    pred1 <- predict(lmFull,newdata=data.frame(Girth=c(1,2,3),Height=c(2,3,4)))
    pred2 <- predict(lmSlim,newdata=data.frame(Girth=c(1,2,3),Height=c(2,3,4)))
    identical(pred1,pred2)
    [1] True
    

    我以文本形式存储的内容是获取lmSlim对象并将其解析:

    lmTxt <- deparse(lmSlim)
    lmTxt <- paste0(lmTxt,collapse="")
    

    将其存储在数据库中很容易,但是当我想再次重复使用它时:

    lmRst <- eval(parse(text=lmTxt))
    class(lmRst)
    [1] "lm"
    predict(lmRst,newdata=data.frame(Girth=c(1,2,3),Height=c(2,3,4)))
    Error in eval(expr, envir, enclos) : object 'Volume' not found
    

    有什么建议吗?

3 个答案:

答案 0 :(得分:1)

我已经解决了这个问题,可能会有一些解决方法,但它确实有效:

# learning and reducing the size of output
lmFull <- lm(Volume~Girth+Height,data=trees)
lmSlim <- lmFull
lmSlim$fitted.values <- lmSlim$qr$qr <- lmSlim$residuals <- lmSlim$model <- lmSlim$effects <- NULL
pred1 <- predict(lmFull,newdata=data.frame(Girth=c(1,2,3),Height=c(2,3,4)))
pred2 <- predict(lmSlim,newdata=data.frame(Girth=c(1,2,3),Height=c(2,3,4)))
identical(pred1,pred2)
[1] TRUE

# deparse and collapse into a string
lmTxt <- deparse(lmSlim)
lmTxt <- paste0(lmTxt,collapse="")

# re-parsing
lmParsed <- eval(parse(text=lmTxt))
lmParsed$call <- lmFull$call
lmParsed$terms <- lmFull$terms
lmParsed
pred3 <- predict(lmParsed,newdata=data.frame(Girth=c(1,2,3),Height=c(2,3,4)))
identical(pred1,pred3)
[1] FALSE

但是...

sum(abs(pred1 - pred3))
[1] 1.634248e-13
as.numeric(object.size(lmParsed) / object.size(lmFull))
[1] 0.3449477

所以我可以忍受它。

答案 1 :(得分:0)

试试这个:

lmTxt <- dput(lmSlim)
lmRst <- eval(lmTxt)
predict(lmRst,newdata=data.frame(Girth=c(1,2,3),Height=c(2,3,4)))

编辑:正如评论中指出的那样,dput不会返回字符串。所以这是另一种选择:

save(lmSlim, file='data.txt', ascii=T)

该文件的内容是ascii,因此应该可以将它们写入数据库。要稍后重新加载,只需使用load命令:

load('data.txt')

答案 2 :(得分:0)

不要将其存储为文本。试试这个:

lmFull <- lm(Volume~Girth+Height,data=trees)
lmSlim <- lmFull
lmSlim$residuals <- NULL
lmSlim$effects <- NULL
lmSlim$fitted.values <- NULL
lmSlim$model <- NULL
lmSlim$qr$qr <- NULL
predict(lmSlim)
#works
predict(lmSlim, newdata=data.frame(Girth=30, Height=20))
#works

object.size(lmFull)
#22960 bytes
object.size(lmSlim)
#7920 bytes