2017-03-21 13 views
0

우리는 3 개의 종속 변수 집합과 6 개의 독립 변수가 그룹화 변수로 태그 지정된 데이터 프레임을 가지고 있다고 가정 해 봅시다. 이 형식의 예는 아래의 샘플 코드 생성 : 나는의 라인을 따라 뭔가를 사용할 수 X1 내지 X6의 설정에 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) 

:

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() 도움말로부터 다음 라인을 이용하여 "응답 행렬이면, 선형 모델은 행렬의 각 열을 최소 제곱 법에 의해 개별적으로 장착되어있다.")

그러나 그룹화 변수로 먼저 그룹화하고 나서 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

응용, 사피, lapply 등의 가족이 이해에 절대적으로 중요합니다. 많은 것을 배울 수있는 무한한 자원이 있습니다. Hadley의 고급 R (온라인에서 사용 가능) 또는 도서 라이브러리의 많은 예제를 참조하십시오. – d8aninja

답변

1

data.table에서는 melt (긴 모양을 변경 - 하나 열에서 결과 변수를 스택 대신 세 개의 열 저장) 수 모두 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에서 실행할 수 있었고 작동합니다. 몇 가지 메모/질문 : (1) 나는 또한 시도했습니다. linest() 함수를 사용하여 Excel에서 결과를 복제하고 결과가 첫 번째 그룹화 변수에만 일치하는 반면, signif 두 번째 그룹화 변수에 대해 icantly 다릅니다. R과 Excel의 최소 제곱 알고리즘이 다른가요? (2) 행의 수가 크게 늘어날 것이므로 longDT를 할당하지 말아야한다는 데 동의하지만 각 계수가 절편, x1 등으로 올바르게 태그가 지정되도록 어떻게 용융 출력을 파이프합니까? – user1689945

+0

결과는 동일해야합니다 (아마도 (X'X)^(- 1) X'Y). 어떤 그룹이 잘못된 추정치를 반환하는지, R 대 Excel의 결과는 무엇인지 구체적으로 설명 할 수 있습니까? – MichaelChirico

+0

@ user1689945 두 번째 사항에 대해서는 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)