如何对多个数据框进行单个逻辑回归?

How to do a single logistic regression with multiple data frames?

目标是使用具有相同结构的多个数据框进行单次有序逻辑回归。

在下面的示例中,我加入了两个数据框,以便能够执行单个有序逻辑回归。但是,我想要一个自动化流程的解决方案,因为有 417 个数据帧。

library(dplyr)
library(MASS)

#dataframe 1
party <- factor(rep(c("Rep","Dem"), c(407, 428)), 
                levels=c("Rep","Dem"))  
rpi <- c(30, 46, 148, 84, 99) # cell counts
dpi <- c(80, 81, 171, 41, 55) # cell counts
ideology <- c("Very Liberal","Slightly Liberal","Moderate","Slightly Conservative","Very Conservative")
pol.ideology <- factor(c(rep(ideology, rpi), 
                         rep(ideology, dpi)), levels = ideology)
data1 <- data.frame(party,pol.ideology)

#dataframe 2
party <- factor(rep(c("Rep","Dem"), c(410, 430)), 
                levels=c("Rep","Dem"))  
rpi2 <- c(26, 50, 140, 95, 99) # cell counts
dpi2 <- c(75, 86, 141, 61, 67) # cell counts
ideology2 <- c("Very Liberal","Slightly Liberal","Moderate","Slightly Conservative","Very Conservative")
pol.ideology <- factor(c(rep(ideology2, rpi2), 
                         rep(ideology2, dpi2)), levels = ideology2)
data2 <- data.frame(party,pol.ideology)

nrow(data1)
nrow(data2)

## Joining dataframes "manually"
dat <- bind_rows(data1,data2)

table(dat)
nrow(dat)

# fit proportional odds model

pom <- polr(pol.ideology ~ party, data=dat)
summary(pom)

所以我尝试循环尝试对 data1 和 date2 进行单一回归。我没有成功,因为回归只考虑了 data2.

## LOOP
data = ls(pattern="data")
for(i in 1:length(ls(pattern="data"))){
  pom <- polr(pol.ideology ~ party, data=i)  
}
summary(pom)

有人可以指出解决方案吗?我最近开始研究 R 上的循环主题。抱歉,如果这个问题很愚蠢。

循环中的 i 不是数据。它是您在循环外创建的字符向量的索引。但是在将名称分配给 data 时要小心,因为您随后会在 for 循环中再创建一项!最好重命名。你的其他问题是你从不保存每个模型的结果,只保存最后一个。所以使用列表将它们全部保存然后 lapply 提取它们。

library(MASS)  # For ordered logistic regression (polr)

## LOOP
my_list = ls(pattern="data")
pom <- list()  # initialise your pom
for(i in 1:length(my_list)){  # or seq_along(my_list)
  pom[[i]] <- polr(pol.ideology ~ party, data=get(my_list[i]))  
}

lapply(pom, summary)

您也可以使用 lapply.

在没有循环的情况下执行此操作

最好的选择是创建一个数据帧列表(假设所有 dfs 都具有相似的结构,并且在您的环境中都是单独的 dfs,名称为 data1data2, data3...)

library(tidyverse)

df_list <- map(paste0("data",1:3), ~eval(sym(.x)))

创建列表后。然后你就可以轻松地做任何你想做的事了。

为单个数据框创建回归.

result_list <- map(df_list, ~polr(pol.ideology ~ party, data=.x))

或者,如果你想创建一个组合数据框的回归。

  1. 将所有数据帧合并在一起。

    big_df <- df_list %>% bind_rows()

  2. 运行 组合 df 的回归。 big_df

    big_df_result <- polr(pol.ideology ~ party, data= big_df)