如何用R ggplot2复现重叠Lasso(Overlap Lasso)绘图
绘制变量选中状态随λ变化的图
数据结构说明
你的selez矩阵是99行(对应99个λ值)、82列(对应82个变量),元素为逻辑值:TRUE表示对应λ下变量被选中,FALSE表示未选中。横轴是lambda向量(长度与selez行数一致),纵轴是变量编号1-82。
方法1:用ggplot2绘制黑白线段(简化版)
ggplot2在自定义坐标轴和格式上更灵活,步骤如下:
- 将矩阵转换为ggplot要求的长格式数据框:
library(tidyverse) # 转换为长格式 selez_long <- selez %>% as.data.frame() %>% mutate(lambda = lambda) %>% pivot_longer(cols = -lambda, names_to = "variable", values_to = "selected") %>% mutate(variable = as.integer(str_remove(variable, "V")))
- 生成黑白线段图:
ggplot(selez_long, aes(x = lambda, y = variable)) + geom_line(aes(color = selected), linewidth = 1) + scale_color_manual(values = c("FALSE" = "white", "TRUE" = "black")) + scale_x_reverse() + # 正则化路径通常按λ从大到小展示,反转横轴更符合习惯 labs(x = "正则化参数λ", y = "变量编号") + theme_minimal() + theme(legend.position = "none")
方法2:调整heatmap的横轴
如果偏好使用heatmap,需要注意heatmap默认会转置矩阵,同时手动指定横轴标签:
# 转置矩阵(heatmap默认行对应横轴,列对应纵轴) selez_t <- t(selez) # 绘制heatmap,自定义横轴标签 heatmap(selez_t, Rowv = NA, Colv = NA, # 禁用聚类,保持变量和λ的原始顺序 col = c("white", "black"), # 黑白配色对应未选中/选中 xlab = "正则化参数λ", ylab = "变量编号", labCol = round(lambda, 3), # 显示λ的近似值 margins = c(5, 5)) # 调整边距避免标签截断
若λ数量过多导致横轴标签重叠,可以只显示间隔标签:
# 每10个λ显示一个标签 labCol <- rep("", length(lambda)) labCol[seq(1, 99, by = 10)] <- round(lambda[seq(1, 99, by = 10)], 3) heatmap(selez_t, Rowv = NA, Colv = NA, col = c("white", "black"), xlab = "正则化参数λ", ylab = "变量编号", labCol = labCol, margins = c(5, 5))
扩展:绘制灰度选中频率图(多次模拟后)
如果后续完成多次模拟,只需将selez替换为多次模拟的选中频率(平均值),再用灰度配色:
# 示例:10次模拟的频率矩阵 freq_matrix <- rowMeans(list(selez1, selez2, selez3, selez4, selez5, selez6, selez7, selez8, selez9, selez10)) # 转换为长格式并绘图 freq_long <- freq_matrix %>% as.data.frame() %>% mutate(lambda = lambda) %>% pivot_longer(cols = -lambda, names_to = "variable", values_to = "frequency") %>% mutate(variable = as.integer(str_remove(variable, "V"))) ggplot(freq_long, aes(x = lambda, y = variable)) + geom_tile(aes(fill = frequency)) + scale_fill_gradient(low = "white", high = "black") + scale_x_reverse() + labs(x = "正则化参数λ", y = "变量编号", fill = "选中频率") + theme_minimal()
内容的提问来源于stack exchange,提问作者scamilatone
相关产品推荐
相关产品推荐

