如何将生成的十分位转换为可用于logit模型分析的变量?
解决方案
1. 基于分位数生成带标签的十分位变量
假设你的数据框为df,用于划分十分位的核心变量为x,可以结合quantile和dplyr生成可直接调用的分组变量:
library(dplyr) # 计算x的十分位分位数,忽略缺失值 x_quantiles <- quantile(df$x, probs = seq(0, 1, 1/10), na.rm = TRUE) # 生成带明确标签的十分位分组变量 df <- df %>% mutate( decile = cut( x, breaks = x_quantiles, include.lowest = TRUE, # 确保最小值被纳入第一个分组 labels = paste0("decile_", 1:10) # 自定义分组名称,如decile_1到decile_10 ) )
生成的decile是因子变量,可直接用于后续分析,比如按十分位分组统计因变量特征:
# 假设因变量为y,按十分位分组计算均值和样本量 df %>% group_by(decile) %>% summarise(avg_y = mean(y, na.rm = TRUE), obs_count = n())
2. 生成独立的十分位哑变量(可选)
如果需要将每个十分位作为单独的变量(比如在logit模型中引入分组效应),可以用fastDummies包生成二进制哑变量:
library(fastDummies) # 基于decile变量生成10个独立哑变量 df <- df %>% dummy_cols( select_columns = "decile", remove_selected_columns = FALSE # 保留原decile变量 )
执行后会新增decile_decile_1到decile_decile_10共10个变量,每个变量取值为1(属于该分组)或0(不属于),可直接在模型中调用:
# 包含十分位哑变量的logit模型(以decile_1为基准组) logit_model <- glm(y ~ decile_decile_2 + decile_decile_3 + ... + decile_decile_10, data = df, family = binomial())
特殊情况处理
- 若
x存在大量重复值导致分位数重复,cut可能报错,可先去重分位数再分组:unique_quantiles <- unique(x_quantiles) df <- df %>% mutate( decile = cut( x, breaks = unique_quantiles, include.lowest = TRUE, labels = paste0("decile_", 1:(length(unique_quantiles)-1)) ) ) - 若无需严格按数值分位数,仅需按样本量均分十分位,可直接用
ntile:df <- df %>% mutate(decile = paste0("decile_", ntile(x, 10)))
内容的提问来源于stack exchange,提问作者StMatthias
相关产品推荐
相关产品推荐

