【问题标题】:Run regression by category, bounded by +/- 10% of the category average按类别运行回归,以类别平均值的 +/- 10% 为界
【发布时间】:2016-11-25 10:07:53
【问题描述】:

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

有没有办法在不拆分数据集和运行单个回归的情况下做到这一点?

谢谢, 唐

【问题讨论】:

    标签: r regression linear-regression


    【解决方案1】:

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

    数据

    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 直接完成所有事情会更容易。

    【讨论】:

    • 谢谢,@Wave!一个修复 - range.min 应该是 m*(1-perc) 而 range.max 应该是 m*(1+perc)
    • 是的,谢谢,那部分我没有考虑清楚。但现在已经解决了。
    猜你喜欢
    • 2011-03-21
    • 1970-01-01
    • 1970-01-01
    • 2020-10-25
    • 1970-01-01
    • 2015-12-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多