2016-09-06 5 views
1

다음과 비슷한 구조의 거대한 데이터 프레임으로 작업하고 있습니다. 나는 output_reg를 사용하여 기울기를 저장하고 각 처리에 대한 절편을 작성하지만 각 lm (y ~ x)에 r.squared를 추가하고 다른 두 열 외에 다른 열에 저장해야합니다. 그 어떤 힌트라도?각 회귀에 대해 r.squared를 얻는 방법?

library(plyr) 

field <- c('t1','t1','t1', 't2', 't2','t2', 't3', 't3','t3') 
predictor <- c(4.2, 5.3, 5.4,6, 7,8.5,9, 10.1,11) 
response <- c(5.1, 5.1, 2.4,6.1, 7.7,5.5,1.99, 5.42,2.5) 
my_df <- data.frame(field, predictor, response, stringsAsFactors = F) 

output_reg<-list() 
    B<-(unique(my_df$field)) 
    for (i in 1:length(B)) { 
    index <- my_df[my_df$field==B[i],] 
x<- index$predictor 
y<- index$response 
output_reg[[i]] <- lm (y ~ x) # gets estimates for each field 
} 

감사

답변

1

r.squared 모델의 요약을 통해 액세스 할 수 있습니다,이 시도 :

:

m <- lm(y ~ x) 
rs <- summary(m)$r.squared 

선형 회귀 분석 결과의 요약 개체가 필요한 거의 모든 것을 포함

output_reg<-list() 
B<-(unique(my_df$field)) 
for (i in 1:length(B)) { 
    index <- my_df[my_df$field==B[i],] 
    x<- index$predictor 
    y<- index$response 
    m <- lm (y ~ x) 
    s <- summary(m)   # get the summary of the model 
    # extract every thing you need from the summary object 
    output_reg[[i]] <- c(s$coefficients[, 'Estimate'], r.squared = s$r.squared) 
} 
output_reg 
#[[1]] 
#(Intercept)   x r.squared 
# 10.7537594 -1.3195489 0.3176692 

#[[2]] 
#(Intercept)   x r.squared 
# 8.8473684 -0.3368421 0.1389040 

#[[3]] 
#(Intercept)   x r.squared 
#-0.30500000 0.35963455 0.03788593 

결과를 함께 바인딩하려면 :

do.call(rbind, output_reg) 
#  (Intercept)   x r.squared 
# [1,] 10.753759 -1.3195489 0.31766917 
# [2,] 8.847368 -0.3368421 0.13890396 
# [3,] -0.305000 0.3596346 0.03788593 
+0

감사합니다 ! 이것은 쉽고 편리한 방법입니다. 그러나 절편과 기울기 및 r.squared에 응답하는 3 개의 다른 열이있는 데이터 그램으로 저장하는 방법은 무엇입니까? – Jack

+0

'do.call (rbind, output_reg)'해야합니다. 답변을 업데이트했습니다. – Psidom

+0

죄송합니다 Psidom, lm (y ~ x + x^2)을 실행하고 싶다면 코드가 어떻게 바뀔까요? 미리 감사드립니다. – Jack

1

당신은 당신에게주는 다음과 같은 사용 purrr

require(purrr) 
my_df %>% 
    slice_rows("field") %>% 
    by_slice(partial(lm, predictor ~ response), .labels = FALSE) %>% 
    flatten %>% 
    map(~c(coef(.), r.squared=summary(.)$r.squared)) 

을 수행 할 수 있습니다

[[1]] 
(Intercept) response r.squared 
    5.9777778 -0.2407407 0.3176692 

[[2]] 
(Intercept) response r.squared 
    9.8195876 -0.4123711 0.1389040 

[[3]] 
(Intercept) response r.squared 
9.68534163 0.10534562 0.03788593 

당신은 data.frame 다시 대신으로 마지막 줄을 사용하려면 다음

map_df(~as.data.frame(t(c(coef(.), r.squared=summary(.)$r.squared)))) 
+0

'split_rows' /'by_slice' /'flatten'은'split' /'map'보다 이점이 있습니까? – aosmith

+0

@aosmith는 "avantage"가 있다고 생각하지 않습니다. 쓰기/읽기가 더 쉽습니다. – Rentrop

0

데이터 프레임을 만들 수 있습니다

model_stats <- data.frame(model$coefficients) 
model_stats <- rbind(model_stats, r.sq = summary(model)$r.squared) 
1

체크 아웃 broom 패키지와 일부 dplyr이 (this vignette 참조)에 뿌려 : 모델이 같은 통계와 함께 또는

library(broom) 
library(dplyr) 

my_df %>% 
    group_by(field) %>% 
    do(glance(lm(predictor ~ response, data = .))) #also see do(tidy(...)) 

# field r.squared adj.r.squared  sigma statistic p.value df logLik  AIC  BIC deviance df.residual 
# <chr>  <dbl>   <dbl>  <dbl>  <dbl>  <dbl> <int>  <dbl>  <dbl>  <dbl> <dbl>  <int> 
# 1 t1 0.31766917 -0.3646617 0.7778175 0.46556474 0.6188153  2 -1.855107 9.710214 7.006051 0.605000   1 
# 2 t2 0.13890396 -0.7221921 1.6513038 0.16131065 0.7568653  2 -4.113593 14.227185 11.523022 2.726804   1 
# 3 t3 0.03788593 -0.9242281 1.3894755 0.03937779 0.8752903  2 -3.595676 13.191352 10.487189 1.930642   1 

먼저 회귀를 저장합니다

regressions <- my_df %>% group_by(field) %>% do(fit = lm(predictor ~ response, data = .)) 

regressions %>% tidy(fit) 
regressions %>% glance(fit) 
관련 문제