我知道,这有点简陋。基本上,我想使用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(我得到的部分) 。想法?
答案 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
进行连接,然后将其重新整理为您想要的格式。