将回归系数从多个模型打印到共享数据帧

时间:2015-04-16 20:57:24

标签: r

我知道,这有点简陋。基本上,我想使用coef函数中的保存数据到共享数据框,以便模型从较大的共享数据集中提取有限的可能变量。

我有3套14种型号。每组使用来自100个可变数据集的15-25个变量,每个模型使用大约12个变量的混合,这些变量从模型变为模型。我想要做的是将14个模型中的每个模型的系数保存到一个数据框中。

Coefs=data.frame(col.names = names(EST))

系数看起来像这样:

Coefficients:
                    Estimate   Std. Error  t value           Pr(>|t|)    
RT_SCORE_USER       0.2427506  0.0310486   7.818 0.0000000000000836 ***
VOD.Window..weeks.  0.0092641  0.0009985   9.278            < 2e-16 ***
PX_WK3              0.0300395  0.0098943   3.036           0.002600 ** 

对于一个好的10-15个变量。例如,PX有14周(WK1,2等)。我想将Estimate值保存到此网格中,对于每一行,有100列列出所有可能的变量。其中大部分都是0.这个表将导入到excel中,我可以简单地将每个星期的模型交叉乘以。

我的斗争是弄清楚如何记录从不同周的所有变化系数到一个data.frame,其中每个模型都有一个单独的行:

       PX_WK1     PXWK_2   RT_SCORE_USER  IMAVARIABLE etc.
ESTWK1   .030     0         .24            0
ESTWK2   0        .023      .44            etc
ESTWK3   0        0         etc etc etc

我理解如何使用coef(ESTWK1),但是当我尝试将其粘贴到一行时,我自然会得到一个混淆两个向量长度的错误,比如说这个模型中的15个是潜在的100个。

我想自动化这个过程,所以当处理新数据并运行回归时,我可以运行我的代码保存新系数的数据,然后我可以将其输出到CSV(我得到的部分) 。想法?

2 个答案:

答案 0 :(得分:7)

第一步是将系数组合成一个数据框,每个模型和术语组合一行。然后,您就可以将其传播到一个表中,每个模型一行,每个术语一列。

我的broom package有一个有用的函数,tidy用于将线性拟合转换为系数的数据框:

fit <- lm(mpg ~ wt + disp + qsec, mtcars)
library(broom)
tidy(fit)
#          term  estimate std.error statistic p.value
# 1 (Intercept) 19.777558    5.9383    3.3305 0.00244
# 2          wt -5.034410    1.2241   -4.1127 0.00031
# 3        disp -0.000128    0.0106   -0.0121 0.99042
# 4        qsec  0.926649    0.3421    2.7087 0.01139

(请注意,与coef不同,这会返回数据框而不是矩阵,并将这些术语合并为列而不是rownames)。您可以将此功能应用于每个模型,然后重新组合,例如与plyr的ldply重新组合。我们使用20个与您的&#34;模型相同的模型生成一个示例&#34;:

models <- replicate(20, lm(mpg ~ wt + disp + qsec, mtcars), simplify = FALSE)
names(models) <- paste0("MODEL", 1:20)

然后我们整理并重新组合&#34;代码将是:

all_coefs <- plyr::ldply(models, tidy, .id = "model")
head(all_coefs)
#    model        term  estimate std.error statistic p.value
# 1 MODEL1 (Intercept) 19.777558    5.9383    3.3305 0.00244
# 2 MODEL1          wt -5.034410    1.2241   -4.1127 0.00031
# 3 MODEL1        disp -0.000128    0.0106   -0.0121 0.99042
# 4 MODEL1        qsec  0.926649    0.3421    2.7087 0.01139
# 5 MODEL2 (Intercept) 19.777558    5.9383    3.3305 0.00244
# 6 MODEL2          wt -5.034410    1.2241   -4.1127 0.00031

然后,您需要删除std.error,statistic和p.value列,并将estimate术语展开。这可以使用dplyr和tidyr包完成:

library(dplyr)
library(tidyr)
results <- all_coefs %>% select(-(std.error:p.value)) %>%
    spread(term, estimate)

这会产生:

     model (Intercept)      disp  qsec    wt
1   MODEL1        19.8 -0.000128 0.927 -5.03
2   MODEL2        19.8 -0.000128 0.927 -5.03
3   MODEL3        19.8 -0.000128 0.927 -5.03
4   MODEL4        19.8 -0.000128 0.927 -5.03
5   MODEL5        19.8 -0.000128 0.927 -5.03

这是您想要的输出。 (这个输出很无聊,因为所有模型都是相同的,但可能是你的不同)。如果某些模型具有其他系数,则缺失值将用NA填充。

答案 1 :(得分:2)

我会通过这样做来解决这个问题:

x1 <- rnorm(10)
x2 <- rnorm(10)
x3 <- rnorm(10)
y <- rnorm(10)
m1 <- lm(y ~ x1 + x2)
m2 <- lm(y ~ x1 + x3) 
m3 <- lm(y ~ x2 + x3)

variables <- data.frame(variable = c("(Intercept)", "x1", "x2", "x3"),
                        model = rep(c("m1", "m2", "m3"), each = 4))
data <- data.frame(variable = c(names(coef(m1)), names(coef(m2)), 
                                names(coef(m3))),
                   estimate = c(coef(m1), coef(m2), coef(m3)), 
                   model = c(rep("m1", length(coef(m1))), 
                             rep("m2", length(coef(m2))),
                             rep("m3", length(coef(m3)))))
data2 <- left_join(variables, data)
data2$estimate[is.na(data2$estimate)] <- 0
data2
reshape(data2, timevar = "variable", v.names = "estimate", 
        idvar = "model", direction = "wide")

基本上,拟合模型,然后提取估计值和行名称。然后创建一个数据框variables,其中包含每个模型的所有可能变量名称。使用left_join中的dplyr进行连接,然后将其重新整理为您想要的格式。