Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/python-2.7/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何将R模型存储为文本?_R_Save_Lm - Fatal编程技术网

如何将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 <

发现了一个类似的问题,但它不是完整的

我的问题分为两部分:

  • 我想将Rlm()对象的“精简”版本存储为DBMS中的文本
  • 我希望能够根据保存的文本对象生成预测
  • 我所说的“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
    
    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