2013-01-19 26 views
2

lm調用對象的數據部分是否有等價更新?在lm()調用中更新數據

例如,假設我有以下型號:

dd = data.frame(y=rnorm(100),x1=rnorm(100)) 
Model_all <- lm(formula = y ~ x1, data = dd) 

有沒有對LM對象上進行操作的方法有等同的效果:

Model_1t50 <- lm(formula = y ~ x1, data = dd[1:50,]) 

我試圖構建一些出自樣本預測測試的psudo,並且擁有單個lm對象並簡單地滾動數據將非常方便。

+0

爲什麼不只是重做'lm'調用,就像你在那裏做的那樣? –

+0

@DavidRobinson,因爲我想將'lm()'對象傳遞給'$ model'中的函數和子集。下面是一個例子:'model_1t50_2 = update(Model_all,data = Model_all $ model [1:50,])' – ricardo

回答

5

我相當確定update實際上做你想做的!

example(lm) 
dat1 <- data.frame(group,weight) 
lm1 <- lm(weight ~ group, data=dat1) 
dat2 <- data.frame(group,weight=2*weight) 
lm2 <- update(lm1,data=dat2) 
coef(lm1) 
##(Intercept) groupTrt 
##  5.032  -0.371 
coef(lm2) 
## (Intercept) groupTrt 
##  10.064  -0.742 

如果你希望從這樣的一個效率芻議增益,你會很失望 - R的只是代以新的參數,並重新評估調用(見update.default代碼)。但它確實使代碼更加清潔......

+0

+1,已接受。謝謝 - 我不知何故錯過了。 – ricardo

1

biglm對象可以更新爲包含更多數據,但不會更少。所以你可以按照相反的順序做到這一點,從較少的數據開始並添加更多的數據。見http://cran.r-project.org/web/packages/biglm/biglm.pdf

不過,我懷疑你感興趣的估計亞羣(參數即如果行1:50對應於因子變量factrvar"a"水平。在這種情況下,你應該使用的互動公式(~factrvar*x1中),而而不是data[1:50,]的子集,這種類型的相互作用將給出factrvar的每個級別的不同效果估計,這比分別估計每個參數更有效,並且將限制任何附加參數(即,x2~factrvar*x1 + x2中)在factrvar - 如果您對相同的模型多次估計到不同的子集,則x2每次都會收到一個單獨的參數估計值。

+0

+1,非常有幫助。我很可能會在某個時候做到這一點,但在這種情況下,這是一個更加香草的要求。 – ricardo