按类别运行回归,以类别平均值的+/- 10%为界

时间:2016-07-21 17:22:38

标签: r regression linear-regression

我有一个包含多个类别的数据集。我想对每个类别运行线性回归,而不必将数据子集化为每个类别的新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相同。

有没有办法在不拆分数据集和运行单个回归的情况下执行此操作?

谢谢, 唐

1 个答案:

答案 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可以更轻松地完成所有操作。