2016-07-21 67 views
0

我有一個包含多個類別的數據集。我想對每個類別運行線性迴歸,而不必將數據分爲每個類別的新dfs。我這樣做是這樣的:按類別運行迴歸,範圍爲平均類別的+/- 10%

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的5和15的y值之間的迴歸。與類別B和C相同。

有沒有辦法做到這一點沒有拆分數據集並運行個別迴歸?

謝謝, 唐

回答

2

我會做這樣的,但也許有一個較短的方式。

基於腳本的數據

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立竿見影。

+0

謝謝@ Wave!一個修正 - range.min應該是m *(1-perc),而range.max應該是m *(1 + perc) –

+0

是的,謝謝,我沒有想到通過那部分。但現在已經修復了。 – Wave