【问题标题】:GLM in all data frames global environment所有数据帧全球环境中的 GLM
【发布时间】:2015-08-15 10:28:10
【问题描述】:

我有一个包含约 200 个唯一“ID”的主数据框,每个 ID 大约有约 200 个“订单”。我已使用

将主数据框拆分为 200 个单独的数据框
list2env(split(df, df$id), envir = .GlobalEnv)

现在,由于每个唯一 ID 有 200 个单独的数据帧,我想创建一个 GLM,我可以在其中获取打印在另一个主数据帧中的每个 ID 的系数和 R^2 值。

所以不要这样做(其中 '1' 到 '200' 是所有的 ID):

test1 <- glm(1$response_var ~ variableA + variableB + variableC, family=gaussian(), data=1)

并在为 200 个 ID 重复此操作的同时手动打印系数,是否可以使用某个函数或某个循环来将所有系数和 R^2 值打印在单个数据框中?

因此,对于此示例,最终结果将是每个 ID 有 200 行,ID、Intercept、Coefficient1、Coefficient2、Coefficient3 和 R^2 有 6 列

【问题讨论】:

  • 为什么将数据拆分为单独的 data.frame 变量?在 data.frames 列表上使用lapply() 或者首先使用by() 会容易得多。如果您想要工作代码,最好包含reproducible example

标签: r loops global-variables environment-variables glm


【解决方案1】:

试试这个例子:

#dummy data
set.seed(123)
df <- data.frame(
  id=rep(c(1,2,3),10),
  response_var=rep(c(1,2),15),
  variableA=runif(30),
  variableB=runif(30),
  variableC=runif(30))

#split by id
df_list <- split(df,df$id)

#loop through every id
do.call(rbind,
        lapply(df_list, function(x){
          fit <- glm(response_var ~ variableA + variableB + variableC, family=gaussian(), data=x)
          coef(fit)
        }))

#output
#   (Intercept)  variableA   variableB   variableC
# 1    0.630746  1.4443321 -0.40875486  0.42797033
# 2    1.447003  0.7121737 -0.01226043 -0.93282962
# 3    1.450429 -0.2306031  0.47827197 -0.01190812

注意:glm 的 R2 是一个全新的世界,请参阅 Pseudo R squared formula for GLMsIs R2 useful or dangerous?

【讨论】:

  • 是的,它工作得很好,并且由于这些原因,R2 也不在 GLM 的摘要中。如果我想将 R2 放在那里,只需将 coef(fit) 行更改为: cor(df_list$response,predict(fit))^2 ?
  • 另外,假设 VariableB 是一个具有 5 个级别的因子变量(在主数据框中)。但是对于某些特定的 ID,只有 1 级。使用它时,我如何不打破“对比只能应用于具有 2 个或更多级别的因素”?
  • @dgssd 避免在 cmets 中提出额外的问题,您需要明确定义问题,提供 reproducible example 并阐明预期输出。
猜你喜欢
  • 2014-10-20
  • 2020-03-22
  • 2021-04-13
  • 1970-01-01
  • 1970-01-01
  • 2016-08-23
  • 2021-08-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多