如何将R模型存储为文本?
发现了一个类似的问题,但它不是完整的 我的问题分为两部分:如何将R模型存储为文本?,r,save,lm,R,Save,Lm,发现了一个类似的问题,但它不是完整的 我的问题分为两部分: 我想将Rlm()对象的“精简”版本存储为DBMS中的文本 我希望能够根据保存的文本对象生成预测 我所说的“slim”是指只要数据量合适,predict()函数就不会失败。我想存储模型,因为学习有时需要很多时间,例如: lmFull <- lm(Volume~Girth+Height,data=trees) lmSlim <- lmFull lmSlim$fitted.values <- lmSlim$qr$qr <
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
lmFull试试这个:
lmTxt <- dput(lmSlim)
lmRst <- eval(lmTxt)
predict(lmRst,newdata=data.frame(Girth=c(1,2,3),Height=c(2,3,4)))
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
文件的内容是ascii码,因此应该可以将其写入数据库。要稍后重新加载,只需使用load
命令:
load('data.txt')
不要将其存储为文本。试试这个:
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
lmFull我已经解决了这个问题,这可能是一个解决办法,但它可以:
# 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
这样我就可以忍受了。谢谢。但是,dput()与它得到的对象具有相同的类。我需要将其保存为字符。对,很抱歉!我用另一个选项编辑了答案,请参见上文。dput确实生成lm对象的文本表示。上面的例子将更清楚与tmpfile请仔细阅读问题,我需要在数据库中存储为文本。我知道如何将对象分配给变量,这不是问题所在。我需要一种写“一些文本”的方法,当我解析它时,它将是一个我可以预测的模型的精简版本。好的,原则上,对于预测,你只需要系数和模型公式。因此,您可以编写自己的predict
函数。谢谢@Roland,我同意,但我编写自己的预测函数不会扩展到其他类型的拟合函数,2永远不会像R内置函数那样高效。你不同意吗?
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
# 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