如何使用多个数据框进行一次逻辑回归?

时间:2020-05-12 02:42:27

标签: r dataframe rstudio regression logistic-regression

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

在下面的示例中,我加入了两个数据框,以便能够进行单次有序逻辑回归。但是,由于有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上的循环主题。很抱歉,这个问题很愚蠢。

2 个答案:

答案 0 :(得分:0)

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

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,而无需循环。

答案 1 :(得分:0)

最好的选择是创建一个数据帧列表(假设所有df具有相似的结构,并且在您的环境中都是独立的df,名称分别为 data1 data2 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)