2012-07-01 35 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