You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用R ggplot2复现重叠Lasso(Overlap Lasso)绘图

绘制变量选中状态随λ变化的图

数据结构说明

你的selez矩阵是99行(对应99个λ值)、82列(对应82个变量),元素为逻辑值:TRUE表示对应λ下变量被选中,FALSE表示未选中。横轴是lambda向量(长度与selez行数一致),纵轴是变量编号1-82。


方法1:用ggplot2绘制黑白线段(简化版)

ggplot2在自定义坐标轴和格式上更灵活,步骤如下:

  1. 将矩阵转换为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")))
  1. 生成黑白线段图:
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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 00:53:22