2015-10-13 19 views
2

我试图使用speedlm(speedglm package)的更新选项,因为我没有足够的RAM一次计算整个模型,而biglm只使用一个CPU。
下面的代码是出错的可重现示例。Speedlm更新“需要呼叫组件的对象”

library(speedglm) 
formula <- Sepal.Length ~ Sepal.Width 
chunk1 <- iris[1:10,] 
chunk2 <- iris[11:20,] 
chunk3 <- iris[21:30,] 
lmfit <- speedlm(formula, chunk1) 
lmfit <- update(lmfit, chunk2) 
lmfit <- update(lmfit, chunk3) 

,我发现了以下错误:

> lmfit <- speedlm(formula, chunk1) 
> lmfit <- update(lmfit, chunk2) 
> lmfit <- update(lmfit, chunk3) 
Error in update.default(lmfit, chunk3) : 
    need an object with call component 
> 

如果是由于有update代替updateWithMoreData我已经期待着与chunk2更新后的错误。

想知道解决这个问题的方法,或者如果我必须使用替代方法。
在此先感谢!


使用updateWithMoreData得到以下错误:

> lmfit <- speedlm(formula, chunk1) 
> lmfit <- updateWithMoreData(lmfit, chunk2) 
Error: object of type 'symbol' is not subsettable 
> lmfit <- updateWithMoreData(lmfit, chunk3) 
Error: object of type 'symbol' is not subsettable 
> 

下面的代码工作,道具@LyzandeR

> library(speedglm) 
> chunk1 <- iris[1:10,] 
> chunk2 <- iris[11:20,] 
> chunk3 <- iris[21:30,] 
> lmfit <- speedlm(Sepal.Length ~ Sepal.Width, chunk1) 
> 
> for (i in list(11,20, 21:30)){ 
+ lmfit2 <- updateWithMoreData(lmfit, iris[i,]) 
+ } 
> lmfit2 
Linear Regression Model of class 'speedlm': 

Call: speedlm(formula = Sepal.Length ~ Sepal.Width, data = chunk1) 

Coefficients: 
(Intercept) Sepal.Width 
    2.9876  0.5813 

> 
+1

也许你想'updateWithMoreData'?根据文档,'update.speedlm'需要一个公式作为第二个参数。 – Roland

+0

@Roland谢谢,我完全错过了文档中的那个。但它不能解决问题。更新我的问题 – Bas

回答

4

为了使用update来更新你的你的模型根据@ Roland的评论,需要使用updateWithMoreData。虽然有一个问题。

如果使用这样的代码,你会得到:

library(speedglm) 
formula <- Sepal.Length ~ Sepal.Width 
chunk1 <- iris[1:10,] 
chunk2 <- iris[11:20,] 
chunk3 <- iris[21:30,] 
lmfit <- speedlm(formula, chunk1) 
#runs fine up to here 

#but this gives an error 
lmfit2 <- updateWithMoreData(lmfit, chunk2) 
Error: object of type 'symbol' is not subsettable 

显然,这是造成的,因为它试图把这个(从回溯):

as.formula(object$call[[2]])

其失败的原因lmfit$call[[2]]返回formula。但是,如果你把它改成这样它的工作原理:

library(speedglm) 
chunk1 <- iris[1:10,] 
chunk2 <- iris[11:20,] 
chunk3 <- iris[21:30,] 
#use the actual formula below so lmfit$call[[2]] will return it 
#and now all the three lines below work fine 
lmfit <- speedlm(Sepal.Length ~ Sepal.Width, chunk1) 
lmfit2 <- updateWithMoreData(lmfit, chunk2) 
lmfit3 <- updateWithMoreData(lmfit, chunk3) 

注意,当你打印出来,既会说他们是因为呼叫保持不变,但结果是正确的块1:

输出:

> lmfit2 
Linear Regression Model of class 'speedlm': 

Call: speedlm(formula = Sepal.Length ~ Sepal.Width, data = chunk1) 

Coefficients: 
(Intercept) Sepal.Width 
    1.8398  0.9181 

> lmfit 
Linear Regression Model of class 'speedlm': 

Call: speedlm(formula = Sepal.Length ~ Sepal.Width, data = chunk1) 

Coefficients: 
(Intercept) Sepal.Width 
    2.3882  0.7468 
+0

甜!你知道我可以如何在一个循环中使用x的更新吗? – Bas

+1

这不应该是非常困难的权利?只需在手之前(或者仅仅是data.frame的行)创建块,然后像'for list in(11:20,21:30)updateWithMoreData(lmfit,iris [i,])'那样循环。在开始循环之前,确保你运行'speedlm(formula = Sepal.Length〜Sepal.Width,data = iris [1:10,])''。这应该工作。使用这个实验,你可以随时发布一个新的问题,以防你遇到麻烦。 – LyzandeR

+1

只有lmfit < - speedlm()需要与lmfit2 < - updateWithMoreData()不同的名称。看到我的问题,我是如何做到的。 – Bas