我有一个包含多个类别的数据集。我想对每个类别运行线性回归,而不必将数据子集化为每个类别的新dfs。我这样做了:
category = c(rep(c("a","b","c"),100))
x = (rep(1:5,60))
y = rnorm(300)*5
df = data.frame(category,x,y)
models = dlply(df, "category", function(dflm)
lm(y ~ x, data = dflm))
lmcoefs = ldply(models, coef)
在lmcoefs中,我现在已经存储了每个类别的系数。
但是,我希望这些回归仅在每个类别的平均值的+/- 50%之内。因此,如果类别A的平均y值是10,我只想在类别A的y值5和15之间运行回归。与类别B和C相同。
有没有办法在不拆分数据集和运行单个回归的情况下执行此操作?
谢谢, 唐
答案 0 :(得分:2)
我会这样做,但也许有一个更短的方式。
数据
ddply(df, "category", function(d,perc=0.5){
m=mean(d$y)
range.min=m*(1-perc)
range.max=m*(1+perc)
d=d[d$y< range.max & d$y> range.min ,]
coef(lm(y ~ x, data = d))
})
#result
category (Intercept) x
1 a 10.04912 -0.042292670
2 b 10.37061 -0.001489721
3 c 10.04206 0.012238932
基于您已经拥有的脚本
{{1}}
而不是使用dlply然后使用ldply,使用ddply可以更轻松地完成所有操作。