gpt4 book ai didi

r - 如何将 lm 对象存储在 R 的数据框中

转载 作者:行者123 更新时间:2023-12-01 09:53:19 25 4
gpt4 key购买 nike

我需要将 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 对象的列),以便我的其余代码可以在添加的模型上工作。

我做错了什么?非常感谢帮助。

最佳答案

列表法:

显然基于@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 函数,您可以获得具有这些名称的实际模型对象并将它们保存在列表中。


在创建模型对象时将它们存储在数据集中:

如果您计划在创建模型对象时存储它们,可以使用 dplyrdo 创建数据框。

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>

关于r - 如何将 lm 对象存储在 R 的数据框中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33627179/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com