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

Run regression by category, bounded by +/- 10% of the category average

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

有没有一种方法可以在不拆分数据集和 运行 单独回归的情况下做到这一点?

谢谢, 唐

我会这样做,但也许有更短的方法。

数据

category = c(rep(c("a","b","c"),100))
x = (rep(1:5,60))
y = rnorm(300,10,3)  # I made these positive values 
df = data.frame(category,x,y)

基于您已有的脚本

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

与其先使用 dlply 再使用 ldply,不如直接使用 ddply 更轻松地完成所有操作。