我是R的新手,我只是在学习apply函数及其工作原理。我只想从变量x上的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,data,env):数字‘env’arg不长度为1
我是根据我进入help(by)时给出的
发布于 2012-07-01 18:30:57
试一试:
tmp <- by(d, year, function(d.subset) lm(x~color, data=d.subset))发布于 2012-07-01 18:37:08
除了使用基本的R函数(这是学习它们是如何工作的一个好主意),它也值得看看谁可能曾经在这方面工作过。将线性模型拟合到数据集的每个子集是一件非常重要的事情,而且人们已经专门为此建立了一些方便的工具。
尝试查看包lme4和函数lmList。从?lmList中的示例来看,
(fm1 <- lmList(Reaction ~ Days | Subject, sleepstudy))它分别适用于每个Reaction ~ Days的线性模型Subject。这很方便,因为提取器方法直接在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上的帮助文件,以查看其他哪些方法可用于诸如置信区间、绘图等。
发布于 2017-12-13 08:50:19
在更现代的软件包中,这要容易得多,例如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(.)中包装lm,这样data.table就不会混淆普通列表(注意is.list(lm(x ~ color, data = d))是TRUE )。
https://stackoverflow.com/questions/11284544
复制相似问题