2017-03-21 2 views
0

3つの従属変数のセットと、6つの独立変数がグループ化変数によってタグ付けされたデータフレームがあるとします。この形式の例は、以下のサンプルコードで生成されます:私はの線に沿って何かを使用することができX6を通じてX1のセットにY1、Y2、Y3のそれぞれを退行したい場合最初にgroup_by()を実行し、列を使ってlm()を反復する方法は?

library(tidyverse) 
library(broom) 
n <- 15 
df <- data.frame(groupingvar= sample(letters[1:2], size = n, replace = TRUE), 
        y1 = rnorm(n,10,1), y2=rnorm(n,100,10), y3=rnorm(n,1000,100), 
        x1= rnorm(n,10,1), x2=rnorm(n,10,1), x3=rnorm(n,10,1), 
        x4=rnorm(n,10,1), x5=rnorm(n,10,1), x6=rnorm(n,10,1)) 
df <- arrange(df,groupingvar) 

(「応答が行列の場合、線形モデルは、行列の各列に最小二乗によって別々に嵌合されている。」ヘルプ)(LMから次の行を使用することによって)

y <- as.matrix(select(df,y1:y3)) 
x <- as.matrix(select(df,x1:x6)) 
regs <-lm(y~x) 
coeffs <- tidy(regs) 
coeffs <- arrange(coeffs,response, term) 

しかし、グループ化変数で最初にグループ化し、次にlm関数を適用する必要がある場合私はそれをどうやって行うのかについてはあまりよく分かりません。私は以下のことを試しましたが、両方のグループについて同じ係数セットを生成します。

regs2 <- df %>% group_by(groupingvar) %>% 
    do(fit2 = lm(as.matrix(select(df,y1:y3)) ~ as.matrix(select(df,x1:x6)))) 
coeffs2 <- tidy(regs2,fit2) 
coeffs2 <- arrange(coeffs2,groupingvar, response) 
+0

"そしてlm関数" ' - >' Hあなたは 'lapply()'を使って試しましたか? – d8aninja

+0

正しく使用する方法がわかりません。私は要素 "y1〜x1 + x2 + ... + x6"、 "y2〜x1 + x2 + ... + x6"、 "y3〜x1 + x2 + ... + x6"という数式リストを作成しようとしました。このリストをlm()に渡そうとしましたが、適切な構文を思いついたと思います。 – user1689945

+0

apply、sapply、lapplyなどのファミリーは、あなたの理解に絶対に重要です。 HadleyのAdvanced R(オンラインで入手可能)または書籍ライブラリの多くの例を参照してください – d8aninja

答えて

1

data.tableでは、melt(長期再構築 - 1列に結果変数をスタックの代わりに、3つの列に格納されている)可能性の両方groupingvarと結果変数によって& lm

library(data.table) 
setDT(df) 

#alternatively, set id.vars = c('groupingvar', paste0('x', 1:6)), etc. 
longDT = melt(df, id.vars = grep('y', names(df), invert = TRUE)) 

#this helper function basically splits a named vector into 
# its two components 
coefsplit = function(reg) { 
    beta = coef(reg) 
    list(var = names(beta), coef = beta) 
} 

#I personally wouldn't assign longDT, I'd just chain this onto 
# the output of melt; 
longDT[ , coefsplit(lm(value ~ ., data = .SD)), by = .(groupingvar, variable)] 
#  groupingvar variable   var   coef 
# 1:   a  y1 (Intercept) -3.595564e+03 
# 2:   a  y1   x1 -3.796627e+01 
# 3:   a  y1   x2 -1.557268e+02 
# 4:   a  y1   x3 2.862738e+02 
# 5:   a  y1   x4 1.579548e+02 
# ... 
# 38:   b  y3   x2 2.136253e+01 
# 39:   b  y3   x3 -3.810176e+01 
# 40:   b  y3   x4 4.187719e+01 
# 41:   b  y3   x5 -2.586184e+02 
# 42:   b  y3   x6 1.181879e+02 
#  groupingvar variable   var   coef 
+0

ありがとう、私はあなたの答えに従うと思うが、Rで動かすことができた。 linest()関数を使用してExcelで結果を複製すると、結果は最初のグループ化変数にのみ一致しますが、signif第2のグループ化変数に対してはicantly異なる。 RとExcelの最小二乗アルゴリズムは異なるのですか? (2)行の数が大幅に増えるのでlongDTを割り当てるべきではないと私は同意するが、どのように各係数も切片、x1などで適切にタグ付けされるように溶湯の出力を配管するだろうか? – user1689945

+0

結果は同じでなければなりません(おそらく両方とも(X'X)^( - 1)X'Yを使用しています)。どのグループが間違った見積りを返しているのか、R対Excelの出力は何ですか? – MichaelChirico

+0

@ user1689945 2番目の点については、edit – MichaelChirico

0

I次のようにcbind()を使用してこれを実現する方法も見つけました:

library(tidyverse) 
library(broom) 
n <- 20 
df4 <- data.frame(groupingvar= sample(1:2, size = n, replace = TRUE), 
        y1 = rnorm(n,10,1), y2=rnorm(n,100,10), y3=rnorm(n,1000,100), 
        x1= rnorm(n,10,1), x2=rnorm(n,10,1), x3=rnorm(n,10,1), 
        x4=rnorm(n,10,1), x5=rnorm(n,10,1), x6=rnorm(n,10,1)) 
df4 <- arrange(df4,groupingvar) 

regs <- df4 %>% group_by(groupingvar) %>% 
    do(fit = lm(cbind(y1,y2,y3) ~ . -groupingvar, data = .)) 
coeffs <- tidy(regs, fit) 
関連する問題