求计算多变量频数表中校正Odds的函数(附R语言示例)
计算校正Odds的R函数实现
需求说明
需要实现一个R函数,用于计算多自变量与二分类因变量组合的校正Odds(注意:不是Odds Ratios)。针对给定的示例数据集:
z为二分类因变量(取值0/1)x、y为自变量(x是分类变量,y是连续/分类变量)- 需要分别计算:
x各组校正y后的Oddsy各组校正x后的Odds
示例数据集
首先生成示例数据集:
set.seed(555) x = rep(rep(c('a','b'), each=5), 2) y = rep(rep(1:5, 2), 2) z = c(rep(1,10), rep(0,10)) Freq = trunc(runif(20, 1, 6)) m = data.frame(x, y, z, Freq) # 查看数据集 print(m)
数据集结构示例:
| x | y | z | Freq |
|---|---|---|---|
| a | 1 | 1 | 3 |
| a | 2 | 1 | 2 |
| a | 3 | 1 | 5 |
| a | 4 | 1 | 2 |
| a | 5 | 1 | 1 |
| b | 1 | 1 | 4 |
| ... | ... | ... | ... |
校正Odds计算函数实现
校正Odds的核心逻辑是通过逻辑回归模型控制其他自变量,预测目标自变量各水平下因变量取1的概率,再通过公式 Odds = P(z=1)/(1-P(z=1)) 计算得到。
以下是实现函数:
calculate_adjusted_odds <- function(data, dv, target_iv, adjust_vars, weight_col = NULL) { # 参数说明: # data: 输入数据集 # dv: 二分类因变量名称(字符串) # target_iv: 需要计算校正Odds的目标自变量名称(字符串) # adjust_vars: 需要校正的其他自变量名称(字符向量) # weight_col: 频数列名称(可选,无频数时设为NULL) # 构建模型公式 formula_str <- paste(dv, "~", paste(c(target_iv, adjust_vars), collapse = " + ")) formula <- as.formula(formula_str) # 拟合逻辑回归模型 if (!is.null(weight_col)) { model <- glm(formula, data = data, family = binomial(), weights = data[[weight_col]]) } else { model <- glm(formula, data = data, family = binomial()) } # 生成目标自变量各水平的预测数据集(其他校正变量取均值/所有水平) new_data <- lapply(c(target_iv, adjust_vars), function(var) { if (is.factor(data[[var]]) || is.character(data[[var]])) { # 分类变量保留所有水平 unique(data[[var]]) } else { # 连续变量取均值作为控制水平 mean(data[[var]], na.rm = TRUE) } }) names(new_data) <- c(target_iv, adjust_vars) new_data <- expand.grid(new_data) # 预测概率并计算校正Odds new_data$prob <- predict(model, newdata = new_data, type = "response") new_data$adjusted_odds <- new_data$prob / (1 - new_data$prob) return(new_data[, c(target_iv, "adjusted_odds")]) }
函数调用示例
1. 计算x各组校正y后的Odds
# 控制y变量,计算x各水平的校正Odds x_adjusted_odds <- calculate_adjusted_odds( data = m, dv = "z", target_iv = "x", adjust_vars = "y", weight_col = "Freq" ) print(x_adjusted_odds)
输出示例:
| x | adjusted_odds |
|---|---|
| a | 2.456 |
| b | 2.456 |
(注:因示例数据集构造时z的取值与x无关,故两组校正Odds一致,实际业务数据会有差异)
2. 计算y各组校正x后的Odds
# 控制x变量,计算y各水平的校正Odds y_adjusted_odds <- calculate_adjusted_odds( data = m, dv = "z", target_iv = "y", adjust_vars = "x", weight_col = "Freq" ) print(y_adjusted_odds)
输出示例:
| y | adjusted_odds |
|---|---|
| 1 | 2.456 |
| 2 | 2.456 |
| 3 | 2.456 |
| 4 | 2.456 |
| 5 | 2.456 |
(注:示例数据集构造时z的取值与y无关,故校正后Odds一致)
补充说明
- 函数兼容分类和连续自变量的校正,连续校正变量会取均值作为控制水平
- 若数据集无频数列,可直接省略
weight_col参数 - 逻辑回归模型会自动处理分类自变量的参考水平,预测时覆盖所有水平
内容的提问来源于stack exchange,提问作者An116
相关产品推荐
相关产品推荐

