Сохранение оценок коэффициентов для моделей с разными коэффициентами
Я пытаюсь сохранить оценки коэффициентов для разных моделей. Чтобы проиллюстрировать мою проблему, вот пример ниже.
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