如何从含binary与ordinal数据的nominal数据集中筛选binary数据做univariate分析及logistic回归?
针对二元数据的筛选与单变量逻辑回归解析方案
一、筛选二元数据的工具/命令
Python 环境
- Pandas:最直接的方式是通过判断列的唯一值数量或取值范围来筛选
import pandas as pd # 假设数据集为 df # 筛选唯一值数量为2的列(宽松匹配,包含yes/no、True/False等二元标识) binary_cols = [col for col in df.columns if df[col].nunique() == 2] # 严格筛选仅含0/1的二元列 binary_cols_strict = [col for col in df.columns if set(df[col].dropna().unique()).issubset({0, 1})] # 提取二元数据子集 df_binary = df[binary_cols] - Scikit-learn:可结合
LabelBinarizer辅助判断,但更适合预处理阶段同步筛选,不如Pandas直接高效。
R 环境
- Base R:通过遍历列判断唯一值属性
# 假设数据集为 df # 筛选唯一值数量为2的列 binary_cols <- names(df)[sapply(df, function(x) length(unique(x)) == 2)] # 严格筛选仅含0/1的列 binary_cols_strict <- names(df)[sapply(df, function(x) all(na.omit(x) %in% c(0, 1)))] # 提取二元数据子集 df_binary <- df[, binary_cols] - Dplyr:用
select_if实现简洁筛选library(dplyr) df_binary <- df %>% select_if(function(x) length(unique(x)) == 2)
二、单变量逻辑回归的变量解析(提取P值)
Python(Statsmodels 实现)
假设已遍历二元自变量,结合二元因变量做逻辑回归,提取P值和优势比:
import statsmodels.api as sm import numpy as np # 假设因变量为 y(二元类型),数据集为 df results = [] for col in binary_cols: X = sm.add_constant(df[col]) # 添加截距项 model = sm.Logit(y, X).fit(disp=0) # disp=0关闭拟合日志 # 提取自变量的P值(排除截距项) p_val = model.pvalues[col] odds_ratio = np.exp(model.params[col]) results.append({"变量名": col, "P值": p_val, "优势比": odds_ratio}) # 转为DataFrame查看结果 results_df = pd.DataFrame(results)
注:Sklearn的
LogisticRegression默认不输出统计量,如需P值建议用Statsmodels,或手动计算Wald统计量。
R(Base R/Purrr 实现)
Base R 循环版本
# 假设因变量为 y(二元0/1类型),数据集为 df results_list <- list() for (col in binary_cols) { formula <- as.formula(paste("y ~", col)) model <- glm(formula, data = df, family = binomial(link = "logit")) # 提取自变量的P值 p_val <- summary(model)$coefficients[col, "Pr(>|z|)"] odds_ratio <- exp(coef(model)[col]) results_list[[col]] <- data.frame(变量名 = col, P值 = p_val, 优势比 = odds_ratio) } # 合并结果为数据框 results_df <- do.call(rbind, results_list)
Purrr 简化版本(替代for循环)
library(purrr) library(dplyr) results_df <- map_dfr(binary_cols, function(col) { formula <- as.formula(paste("y ~", col)) model <- glm(formula, data = df, family = binomial) tibble( 变量名 = col, P值 = summary(model)$coefficients[col, 4], 优势比 = exp(coef(model)[col]) ) })
注:若模型出现收敛警告,需检查自变量与因变量的相关性,或确认样本量是否充足。
内容的提问来源于stack exchange,提问作者lorrsto
相关产品推荐
相关产品推荐

