如何剥离glm模型?

时间:2015-03-06 19:07:40

标签: r glm

glm返回的对象包含residualsfitted valueseffectsqr$qrlinear.predictorsweights& c& c加起来一个巨大的物体(如果输入足够大)。

如何将其删除,以便 predict之类的仍可用?

理想情况下,我想要一个能够返回等于function(x) predict(my_model,data.frame(x=x))函数对象的函数;类似于as.stepfunisoreg

1 个答案:

答案 0 :(得分:3)

大多数模型组件都是描述性的,predict无需工作。辅助函数(HT: R-Bloggers)可用于删除脂肪:

stripGlmLR = function(cm) {
  cm$y = c()
  cm$model = c()

  cm$residuals = c()
  cm$fitted.values = c()
  cm$effects = c()
  cm$qr$qr = c()  
  cm$linear.predictors = c()
  cm$weights = c()
  cm$prior.weights = c()
  cm$data = c()


  cm$family$variance = c()
  cm$family$dev.resids = c()
  cm$family$aic = c()
  cm$family$validmu = c()
  cm$family$simulate = c()
  attr(cm$terms,".Environment") = c()
  attr(cm$formula,".Environment") = c()

  cm
}

现在,您可以将其应用于模型,以减小5个数量级的尺寸(在此示例中):

traindata <- data.frame(x = rnorm(1e6), y = rnorm(1e6))
testdata <- data.frame(x = rnorm(10))

mod1 <- glm(y~x, data= traindata)
mod2 <- stripGlmLR(mod1)

format(object.size(mod1), units = "Kb")
# [1] "492234.5 Kb"
format(object.size(mod2), units = "Kb")
# [1] "18.5 Kb"

all(predict(object = mod1, newdata = testdata) == 
    predict(object = mod2, newdata = testdata))
# [1] TRUE

请注意,如果您希望能够使用全套glm方法,则需要保留模型的其他组件。