我需要将lm fit对象存储在数据框中以便进一步处理(这是必需的,因为我将有大约200多个回归存储在数据框中)。我无法将fit对象存储在数据框中。以下代码生成错误消息:
x = runif(100)
y = 2*x+runif(100)
fit = lm(y ~x)
df = data.frame()
df = rbind(df, c(id="xx1", fitObj=fit))
Error in rbind(deparse.level, ...) :
invalid list argument: all variables should have the same length
我想得到dplyr的“do”调用返回的数据框,例如:
> tacrSECOutput
Source: local data frame [24 x 5]
Groups: <by row>
sector control id1 fit count
1 Chemicals and Chemical Products S tSector <S3:lm> 2515
2 Construation and Real Estate S tSector <S3:lm> 985
请注意,这只是一个示例输出。我想以上述格式创建数据框(适合lm对象的列),以便我的其余代码可以在添加的模型上工作。
我做错了什么?非常感谢你的帮助。
答案 0 :(得分:4)
列表方法:
显然基于@Pascal的想法。不是列表的粉丝,但在某些情况下它们非常有帮助。
set.seed(42)
x <- runif(100)
y <- 2*x+runif(100)
fit1 <- lm(y ~x)
set.seed(123)
x <- runif(100)
y <- 2*x+runif(100)
fit2 <- lm(y ~x)
# manually select model names
model_names = c("fit1","fit2")
# create a list based on models names provided
list_models = lapply(model_names, get)
# set names
names(list_models) = model_names
# check the output
list_models
# $fit1
#
# Call:
# lm(formula = y ~ x)
#
# Coefficients:
# (Intercept) x
# 0.5368 1.9678
#
#
# $fit2
#
# Call:
# lm(formula = y ~ x)
#
# Coefficients:
# (Intercept) x
# 0.5545 1.9192
鉴于您的工作空间中有许多模型,您需要做的唯一“手动”操作是提供模型名称的向量(它们是如何存储的),然后使用get
函数可以使用这些名称获取实际的模型对象,并将它们保存在列表中。
在创建数据集时将模型对象存储在数据集中:
如果您计划在创建模型对象时存储模型对象,则可以使用dplyr
和do
创建数据框。
library(dplyr)
set.seed(42)
x1 = runif(100)
y1 = 2*x+runif(100)
set.seed(123)
x2 <- runif(100)
y2 <- 2*x+runif(100)
model_formulas = c("y1~x1", "y2~x2")
data.frame(model_formulas, stringsAsFactors = F) %>%
group_by(model_formulas) %>%
do(model = lm(.$model_formulas))
# model_formulas model
# (chr) (chr)
# 1 y1~x1 <S3:lm>
# 2 y2~x2 <S3:lm>
这实际上取决于“组织”的过程如何让您构建您提到的200多个模型。如果它们依赖于特定数据集的列,则可以通过这种方式构建模型。如果您想基于不同数据集的各个列(可能是不同的工作空间或不同的模型类型(线性/逻辑回归))构建模型,它将无法工作。
将现有模型对象存储在数据集中:
实际上我认为你仍然可以使用与list
方法相同的哲学来使用dplyr。如果模型已经构建,您可以使用这样的名称
library(dplyr)
set.seed(42)
x <- runif(100)
y <- 2*x+runif(100)
fit1 <- lm(y ~x)
set.seed(123)
x <- runif(100)
y <- 2*x+runif(100)
fit2 <- lm(y ~x)
# manually select model names
model_names = c("fit1","fit2")
data.frame(model_names, stringsAsFactors = F) %>%
group_by(model_names) %>%
do(model = get(.$model_names))
# model_names model
# (chr) (chr)
# 1 fit1 <S3:lm>
# 2 fit2 <S3:lm>
答案 1 :(得分:3)
这似乎有效:
x = runif(100)
y = 2*x+runif(100)
fit = lm(y ~x)
df <- data.frame()
fitvec <- serialize(fit,NULL)
df <- rbind(df, data.frame(id="xx1", fitObj=fitvec))
fit1 <- unserialize( df$fitObj )
print(fit1)
的产率:
Call:
lm(formula = y ~ x)
Coefficients:
(Intercept) x
0.529 1.936
更新好的,现在更加复杂,以便每次合适获得一行。
vdf <- data.frame()
fitlist <- list()
niter <- 5
for (i in 1:niter){
# Create a new model each time
a <- runif(1)
b <- runif(1)
n <- 50*runif(1) + 50
x <- runif(n)
y <- a*x + b + rnorm(n,0.1)
fit <- lm(x~y)
fitlist[[length(fitlist)+1]] <- serialize(fit,NULL)
}
vdf <- data.frame(id=1:niter)
vdf$fitlist <- fitlist
for (i in 1:niter){
print(unserialize(vdf$fitlist[[i]]))
}
的产率:
Call:
lm(formula = x ~ y)
Coefficients:
(Intercept) y
0.45689 0.07766
Call:
lm(formula = x ~ y)
Coefficients:
(Intercept) y
0.44922 0.00658
Call:
lm(formula = x ~ y)
Coefficients:
(Intercept) y
0.41036 0.04522
Call:
lm(formula = x ~ y)
Coefficients:
(Intercept) y
0.40823 0.07189
Call:
lm(formula = x ~ y)
Coefficients:
(Intercept) y
0.40818 0.08141