2012-07-01 21 views
5

我是R新手,剛剛學習了apply函數及其工作原理。我只是想在幾年內從產品顏色和品牌中提取適合變量x的lm的係數。按功能應用lm()

我知道我可以創建一個for循環和模型年的數據子集並適合它,但我認爲它的時間我開始使用更多的內置函數,所以我希望能夠使用by函數或其中一個應用功能。這就是我的想法。

#some made up data 

x<-rnorm(50,13400,1200) 
color<-sample(factor(c("Red","Black","Blue","Green","White")),50,replace=T) 
year<-sample(factor(2006:2012),50,replace=T) 
brand<-sample(factor(c("A","B","C","D")),50,replace=T) 

d<-data.frame(x,color,year,brand) 

#now I want to fit the model lm(x~color+brand) for each year level 
#this is what I was thinking... 

tmp<-with(d,by(x,year,function(y) lm(x~color,data=y))) 
sapply(tmp,coef) 

錯誤的eval(predvars,數據,ENV):數字 'ENVIR' 精氨酸不長度當我進入help(by)

一個

我立足這個離exapmleř得到的

+0

你混合不同的範式設立環境:該'with'範式和'數據= '範例,而且,d $ x變量有50個不同的值,所以你只會將單行數據幀傳遞給lm()。看起來mplourde能夠辨別你的意圖,所以我會在你之後刪除這個註釋接受他/她的回答 –

+0

我建議你,但通過「品牌」只...並保持簡單...也許然後我會明白它是如何工作的 – moldovean

回答

5

嘗試此代替:

tmp <- by(d, year, function(d.subset) lm(x~color, data=d.subset)) 
+1

我想你可能能夠縮短這個'通過(d, year,lm,formula = x〜color)',因爲如果提供了'formula','lm'將與參數匹配,下一個未說明的參數,即'data' ... –

5

除了與基礎R FUNCT這樣做離子(這是學習它們如何工作的好主意),也值得關注誰可能在之前做過這方面的工作。將線性模型擬合到數據集的每個子集是出現一堆,事實證明人們已經爲此專門構建了一些便利的工具。

試看包裝lme4和功能lmList。從在?lmList的例子中,

(fm1 <- lmList(Reaction ~ Days | Subject, sleepstudy)) 

符合該線性模型Reaction ~ Days分別爲每個Subject。這是conveient因爲提取方法直接在fm1工作:

> coef(fm1) 
    (Intercept)  Days 
308 244.1927 21.764702 
309 205.0549 2.261785 
310 203.4842 6.114899 
330 289.6851 3.008073 
331 285.7390 5.266019 
332 264.2516 9.566768 
333 275.0191 9.142045 
334 240.1629 12.253141 
335 263.0347 -2.881034 
337 290.1041 19.025974 
349 215.1118 13.493933 
350 225.8346 19.504017 
351 261.1470 6.433498 
352 276.3721 13.566549 
369 254.9681 11.348109 
370 210.4491 18.056151 
371 253.6360 9.188445 
372 267.0448 11.298073 

(行號都爲Subjects ID值)查看幫助文件在?lmList,看看有什麼其他方法可用的東西像置信區間,繪圖等等

+1

除了joran的評論:a)你也可以在包nlme中使用lmList,它具有更好的文檔; b)通常在子集上使用lmList或許多lm並不是一個好主意。使用lme/lmer的威力,將年份視爲隨機或固定效果(在這種情況下使用nls)。 –

+0

對上述內容的更正:最後一句應爲「在這種情況下使用gls」 –

1

這在更現代化的包裝中要容易得多,例如data.table

library(data.table) 
setDT(d) 
d[ , .(reg = list(lm(x ~ color))), by = year] 
# year reg 
# 1: 2012 <lm> 
# 2: 2006 <lm> 
# 3: 2011 <lm> 
# 4: 2008 <lm> 
# 5: 2007 <lm> 
# 6: 2010 <lm> 
# 7: 2009 <lm> 

reg列具有lm對象;注意,我們需要在list(.)使data.table不會混淆普通列表來包裝lm(注意:is.list(lm(x ~ color, data = d))TRUE