Сохранение оценок коэффициентов для моделей с разными коэффициентами

Я пытаюсь сохранить оценки коэффициентов для разных моделей. Чтобы проиллюстрировать мою проблему, вот пример ниже.

library(fpp)

creditlog <- data.frame(score=credit$score, 
  log.savings=log(credit$savings+1), 
  log.income=log(credit$income+1), 
  log.address=log(credit$time.address+1),
  log.employed=log(credit$time.employed+1)) 

fit_1 <-lm(score ~ log.income + log.address + log.employed , data=creditlog)
fit_2 <-lm(score ~ log.savings +  log.employed , data=creditlog)
fit_3 <-lm(score ~  log.address + log.employed , data=creditlog)
fit_4 <- lm(score ~  log.income + log.address , data=creditlog)


coef_1 <-summary(fit_1)$coef[,1]
coef_2 <-summary(fit_2)$coef[,1]
coef_3 <-summary(fit_3)$coef[,1]
coef_4 <-summary(fit_4)$coef[,1]
> coef_1
 (Intercept)   log.income  log.address log.employed 
  -14.957037    10.082396     3.353521     1.049130 
> coef_2
 (Intercept)  log.savings log.employed 
    24.34323     11.28698      1.92655 
> coef_3
 (Intercept)  log.address log.employed 
   26.115064     3.438382     1.213017 
> coef_4
(Intercept)  log.income log.address 
  -13.38037    10.23459     3.58023 

Если я попробую rbind, я получу

       (Intercept) log.income log.address log.employed
coef_1   -14.95704  10.082396    3.353521      1.04913
coef_2    24.34323  11.286978    1.926550     24.34323
coef_3    26.11506   3.438382    1.213017     26.11506
coef_4   -13.38037  10.234590    3.580230    -13.38037
Warning message:
In rbind(coef_1, coef_2, coef_3, coef_4) :
  number of columns of result is not a multiple of vector length (arg 2)
> 

что не правильный ответ. Что мне нужно, это что-то вроде

     (Intercept)    log.savings  log.income  log.address    log.employed 
fit_1   -14.957037  NA           10.082396   3.353521       1.04913
fit_2   24.34323    11.28698     NA          NA             1.92655
fit_3   26.115064   NA           NA          3.438382       1.213017
fit_4   -13.38037   NA           10.23459    3.58023        NA

Заранее спасибо.

3 ответа

Вот способ сделать это с помощью относительно короткого фрагмента кода. Оно использует coef непосредственно извлечь коэффициенты из модельного объекта, и lapply чтобы не повторять один и тот же код для каждого объекта модели. rbind.fill заботится о размещении каждого значения коэффициента в правильном столбце:

library(plyr) # For the rbind.fill function

fits = rbind.fill(lapply(list(fit_1, fit_2, fit_3, fit_4), 
                  function(x) as.data.frame(t(coef(x)))))

fits
  (Intercept) log.income log.address log.employed log.savings
1   -14.95704   10.08240    3.353521     1.049130          NA
2    24.34323         NA          NA     1.926550    11.28698
3    26.11506         NA    3.438382     1.213017          NA
4   -13.38037   10.23459    3.580230           NA          NA

Если у вас есть более четырех объектов модели и вы не хотите вводить все их имена, вы можете ссылаться на имена объектов программно. Например, если у вас есть объекты модели fit_1 через fit_20затем заменить list(fit_1, fit_2, fit_3, fit_4) с mget(paste0("fit_", 1:20)), mget берет вектор текстовых строк и возвращает объекты с этими именами.

Вы можете преобразовать векторы в data.frames и использовать dplyr rbind_all:

library(dplyr)
# transforming in data.frames
coef_1 <- as.data.frame(t(summary(fit_1)$coef[,1]))
coef_2 <- as.data.frame(t(summary(fit_2)$coef[,1]))
coef_3 <- as.data.frame(t(summary(fit_3)$coef[,1]))
coef_4 <- as.data.frame(t(summary(fit_4)$coef[,1]))

# binding them all
coefs <- rbind_all(list(coef_1, coef_2, coef_3, coef_4))
row.names(coefs) <- c("fit_1", "fit_2", "fit_3", "fit_4")
coefs


      (Intercept) log.income log.address log.employed log.savings
fit_1   -14.95704   10.08240    3.353521     1.049130          NA
fit_2    24.34323         NA          NA     1.926550    11.28698
fit_3    26.11506         NA    3.438382     1.213017          NA
fit_4   -13.38037   10.23459    3.580230           NA          NA

Далее можно использовать базу R для объединения списков с частичными столбцами:

c1 = data.frame(a=1,b=2,d=3)
c2 = data.frame(b=2,c=3)
c3 = data.frame(a=4,d=5)

cc = data.frame(a=numeric(), b=numeric(), c=numeric(), d=numeric())
ff = function(vect, cc){
    n = nrow(cc)+1
    for(i in 1:length(vect)){
        cc[n,names(vect)[i]] = vect[i]
    }
    cc
}

cc=ff(c1, cc)
cc=ff(c2, cc)
cc=ff(c3, cc)
cc
   a  b  c  d
1  1  2 NA  3
2 NA  2  3 NA
3  4 NA NA  5
Другие вопросы по тегам