如何在R中使用glmnet获取逻辑Lasso回归的p值?
逻辑Lasso回归模型获取p值的方法
glmnet的正则化模型(包括Lasso)默认不输出p值——因为Lasso的正则化约束改变了系数的分布,传统假设检验(如Wald检验)的前提不再成立。不过可以通过以下两种常用方法近似估计p值:
方法1:自助法(Bootstrap)估计系数显著性
通过重复抽样训练数据、拟合多个Lasso模型,来估计系数的分布,进而推导p值:
library(glmnet) library(boot) # 定义自助抽样的核心函数:输入抽样后的数据集,返回指定lambda下的自变量系数 boot_lasso_coef <- function(data, indices, target_lambda) { sampled_data <- data[indices, ] x_mat <- as.matrix(sampled_data[, c("math", "physics", "bmi")]) y_vec <- sampled_data$pass lasso_fit <- glmnet(x_mat, y_vec, family = "binomial", lambda = target_lambda) coef(lasso_fit)[-1] # 排除截距项,只返回自变量系数 } # 提取之前交叉验证得到的最优lambda optimal_lambda <- lasso.model$lambda.min # 执行自助抽样,这里设置1000次抽样(次数越多结果越稳定,耗时也越长) bootstrap_result <- boot(data = train, statistic = boot_lasso_coef, R = 1000, target_lambda = optimal_lambda) # 计算每个变量的p值:基于自助样本中系数符号的一致性 calc_p_value <- function(boot_coefs) { pos_prop <- mean(boot_coefs > 0) 2 * min(pos_prop, 1 - pos_prop) } p_values_bootstrap <- sapply(1:ncol(bootstrap_result$t), calc_p_value) names(p_values_bootstrap) <- colnames(train[,2:4]) # 输出结果 p_values_bootstrap
方法2:针对非零系数变量的似然比检验
Lasso会将部分变量系数压缩为0,对于保留下来的非零系数变量,可以用似然比检验来近似p值:
# 安装并加载glmnetUtils(提供更便捷的公式接口) install.packages("glmnetUtils") library(glmnetUtils) # 用最优lambda重新拟合模型 lasso_fit <- glmnet(pass ~ math + physics + bmi, data = train, family = "binomial", lambda = optimal_lambda) # 提取Lasso选择出的非零系数变量(排除截距) selected_vars <- names(coef(lasso_fit))[-1] # 拟合无正则化的逻辑回归基准模型(仅包含选中的变量) full_glm <- glm(pass ~ ., data = train[, c("pass", selected_vars)], family = "binomial") # 对每个选中变量做似然比检验 p_values_lrt <- sapply(selected_vars, function(var) { # 拟合去掉当前变量的简化模型 reduced_glm <- update(full_glm, formula = as.formula(paste("pass ~ . -", var))) # 执行似然比检验 lrt_result <- anova(reduced_glm, full_glm, test = "Chisq") lrt_result$`Pr(>Chi)`[2] }) # 输出结果 p_values_lrt
注意点
- 自助法的结果受抽样次数影响,建议至少设置500次以上的抽样次数。
- 似然比检验仅适用于Lasso保留的非零系数变量,被压缩为0的变量无需检验。
- 正则化模型的p值是近似估计,解释时要注意和普通逻辑回归p值的区别,不能直接套用传统的显著性标准。
内容的提问来源于stack exchange,提问作者Lee
相关产品推荐
相关产品推荐

