主题
MR 本地分析环境 · 使用说明
2026-07-12 建。MR 重活主力已从腾讯云迁到本地台式机(i5-13490F / 32G / D盘6.7T), 因为数据在本地、消除跨墙搬大文件的卡顿。整套 R 环境装在 Windows 的 WSL2 Linux 子系统里。
一、怎么打开用
本机
浏览器开 http://localhost:8787 → 登录 research / 〈密码·见Vaultwarden〉
任意电脑(需台式机开机+已登录 Windows)
浏览器开 https://mr.stlog.cn → 过两道门:
- 网页弹框 basic auth:
cong/〈密码·见Vaultwarden〉 - RStudio 登录:
research/〈密码·见Vaultwarden〉
远程能访问的前提:台式机开着、你登录了 Windows(登录时 Startup 里的
wsl-mr-keepalive.vbs会自动保活 WSL,RStudio+隧道随之自启)。关机/注销就断。
二、东西都在哪
代码:F 盘是唯一真源(四个项目,2026-07-26 起统一)
| 项目 | F 盘真源(git) | WSL 执行机 | 内容 |
|---|---|---|---|
mr-pipeline | F:\project\mr-pipeline | /home/research/mr-pipeline | 主 MR 筛查流水线 |
multiomics-mr | F:\project\multiomics-mr | /home/research/multiomics-mr | eQTL / 代谢物 / meQTL / 视网膜 / 整合 |
dr-amd-targets | F:\project\dr-amd-targets | /home/research/dr-amd-targets | 单细胞 / 通讯 / 轨迹 / bulk / GSEA |
decode-rep | F:\project\decode-rep | /home/research/decode-rep | deCODE 换平台复制 |
规则统一:F 盘改代码 → WSL git pull 执行。WSL 只读。
★ 2026-07-26 修复了两个真实的代码丢失风险
风险一:三个项目根本没有 F 盘副本、没有版本控制。multiomics-mr / dr-amd-targets / decode-rep 的代码此前只存在于 WSL (WSL 文件系统是 AppData 里的 ext4.vhdx,Windows 备份看不到、wsl --unregister 即全毁)。 已建仓迁入(25 / 29 / 5 个文件),并把 WSL 接成跟踪副本。
风险二:mr-pipeline 发生了反向漂移——产出当前结果的代码从未回到 F 盘。 本页 07-17 记的事故是「F 盘的改动没进 WSL」;这次是反方向: WSL 里有 17 个已修改 + 11 个未跟踪的代码文件从未回迁,其中包括
- 2026-07-22「AMD 与并发症分家」的全部实现(
04_ldsc.R的R13_dm/R13_amd双家族等) - 分析阶段 17–21(外部复制、候选 shortlist、斑马鱼同源、细胞模型对应)
tools/verify_coloc_pqtl.R、verify_ldsc.R—— docs 已引用为「独立复算证据」却不在库里
后果:当时若换机只拷 F 盘,拿到的是分家之前的代码,复现不出当前任何结果。 已全部回迁并提交(70bc04a,跟踪文件 71→82)。
教训:「F 盘是唯一真源」是约定,不是机制。没有强制手段时它两个方向都会漂。 换机或长间隔之后,第一件事是 git status 两侧对照,见下方漂移自检。
WSL 读 F 盘 git 仓需要 safe.directory
F 盘仓库由 Windows 用户创建,WSL 里 UID 不同,git 会拒绝(dubious ownership)。 四个项目都需要(换机后要重做):
bash
for p in mr-pipeline multiomics-mr dr-amd-targets decode-rep; do
git config --global --add safe.directory "/mnt/f/project/${p}"
git config --global --add safe.directory "/mnt/f/project/${p}/.git"
done另外 F 盘的 git init 必须在 Windows 侧做——WSL 的 research 用户无法在 NTFS 挂载上 chmod,会报 could not set 'core.filemode' 而建出坏仓库。WSL 侧则要 git config core.filemode false。
数据:主体在 D 盘,但两个新项目有例外
| 内容 | 路径 | 流水线软链 | 体积 |
|---|---|---|---|
| 结局数据 | D:\mrdata\outcome\ | data/outcome → /mnt/d/mrdata/outcome | 33G |
| 暴露数据(UKB-PPP ST9) | D:\mrdata\exposure\protein_info.csv | data/exposure/protein_info.csv → 它 | 3.9M |
| UKB-PPP 区域数据 | D:\mrdata\ukbppp_regional\(HyPrColoc 用) | — | 34G |
| LDSC 参考 | D:\mrdata\ldsc\ | — | 76M |
mr-pipeline的数据一律放D:\mrdata\,F 盘不存数据。 D 盘 7.3T 只用了 12%(剩 6.5T);F 盘 908G 已用 89%(仅剩约 107G)。 2026-07-17 已把最后一个数据文件protein_info.csv迁到 D 盘, 并清理了 5.2G 与 D 盘重复的旧副本。F 盘只放代码(git 仓)与文档。
⚠️ 2026-07-26 实测订正:「数据全部在 D 盘」只对 mr-pipeline 成立
两个后来建的项目把数据放在 WSL 内部,没走 D 盘约定:
| 位置 | 体积 | 内容 | 丢了能否自动拿回 |
|---|---|---|---|
dr-amd-targets/data/scrna | 5.2 G | GEO 单细胞矩阵 | ✅ 可重下 |
dr-amd-targets/data/ega_retina | 908 M | EGA 视网膜(受控访问) | ❌ 需重新走审批 |
multiomics-mr/03_meqtl_smr/gwas | 4.9 G | 由 FinnGen 生成的 .ma | ✅ 可重跑 |
multiomics-mr/03_meqtl_smr/mqtl | 663 M | 血 mQTL | ✅ 可重下 |
multiomics-mr/05_retina/data | 1.3 G | Advani Zenodo | ✅ 可重下 |
ega_retina 908M 必须单独备份——它是 EGA 受控数据,换机不能靠"重下", 要重新申请授权。建议移到 D:\mrdata\ega_retina\ 并在 WSL 建软链。
为什么不把所有数据都挪到 D 盘(实测)
因为 WSL 访问 /mnt/d 走 9p 协议,有实测代价:
| WSL 原生 ext4 | /mnt/d(9p) | 倍数 | |
|---|---|---|---|
| 顺序读吞吐 | 859 MB/s | 126 MB/s | 慢 6.8× |
| 300 个小文件 stat/read | 0.01 s | 0.23 s | 慢 ~23× |
所以正确的分层判据不是「数据 vs 代码」,而是「丢了能不能自动拿回来」:
| 层 | 放哪 | 理由 |
|---|---|---|
| 代码 | F 盘 + git,WSL 只 pull | 仅 ~1.6 MB,无性能影响;Windows 可见可备份、有版本history |
| 不可再生的原始数据 | D 盘(含 EGA 受控数据) | 125 G 不该塞进 WSL 的 vhdx;顺序大读 126 MB/s 可接受 |
| 可再生的热数据 + 产物 | WSL 原生 | 快 6.8–23×;丢了能重下/重跑,换机不用搬 |
💡 代码全部使用相对路径
data/outcome、data/exposure/protein_info.csv, 数据搬家只需重指软链(ln -sfn 新路径 data/exposure/protein_info.csv),不用改任何代码。
结果与配置
| 内容 | 路径 |
|---|---|
| 结果 | .../mr-pipeline/results/screen_R9/、screen_R13/(*_significant.csv=显著蛋白,SUMMARY_publication.csv=汇总,figures/=图) |
| 下游结果 | results/phewas/、results/ldsc/+ldsc_R13/、results/hyprcoloc_R9/+hyprcoloc_R13/ |
| 配置 | .../mr-pipeline/config.yaml、outcome_manifest.csv(结局清单) |
看结果最简单:直接在 RStudio 右下 Files 面板点开;或资源管理器地址栏粘 \\wsl.localhost\Ubuntu-24.04\home\research\mr-pipeline\results。
二点五、数据家底与 LD 面板(2026-07-20 核对)
D:\mrdata\ 已是唯一完整副本,Server1 上没有本地缺的东西:
| 目录 | 占用 | 内容 |
|---|---|---|
ukbppp_regional/ | 34 G | UKB-PPP 每蛋白 cis 区域 tar(共定位/locus 图用) |
outcome/ | 33 G | FinnGen R9 全套 + R13 + IAMDGC(6.47 G 解压版)+ GCST + Mahajan |
singlecell/ | 2.4 G | HRCA hrca_allcells.h5ad |
eqtl_retina_strunz/ | 2.2 G | Strunz 视网膜 NSR eQTL(22 条染色体) |
ldsc/ | 76 M | eur_w_ld_chr + w_hm3.snplist |
ldpanel/ | 1.5 G | 1000G EUR PLINK 面板(EUR.bed/bim/fam,GRCh37),locus 图算 r² 用 |
LD 面板只取了 EUR
Server1 /root/ldpanel/1kg.v3.tgz 里有全 5 人群(AFR/AMR/EAS/SAS/EUR)。本地只取了 EUR—— 本课题的 pQTL 与 GWAS 都是欧洲人群,用 EUR 才是对的。将来若做东亚人群那条差异化线,再去取 EAS。
不要把数据硬链到 web 目录后忘记删
早期为绕过跨墙限速,做法是把大文件硬链到 /var/www/roundcube/ 再经 Cloudflare 拉取。 这等于把数据挂到公网上——2026-07-20 巡检发现 5 个 FinnGen R13 文件(约 4 G)一直公开可下载,已删除(原件在 /root/finngen_r13/,硬链接 links=2,删 webroot 那份不影响本体)。 以后用完当次就删,或改用 scp 走代理直连。
三、怎么跑一次分析
在 RStudio 里开 Terminal(菜单 Tools→Terminal,或左下 Terminal 标签),敲:
bash
cd ~/mr-pipeline
git pull # ← 先拉最新代码!真源在 F 盘
Rscript analysis/01_screen.R R9 # 全并发症筛查 R9(manifest 驱动,23 结局)
Rscript analysis/01_screen.R R13 # 同上 R13(14 结局)
Rscript analysis/02_visualize.R results/screen_R9 # 生成 UpSet/森林/网络图结果写到 results/screen_R9/(或 _R13)。参考耗时:R9 约 17 分钟,R13 约 11 分钟。
analysis/01_screen.R断点续跑:按结局缓存,删/加结局重跑只算变化的;加force参数强制重算。- 结局清单在
outcome_manifest.csv(含病例/对照数,取自官方 manifest)。 - 老脚本
legacy/batch_screen.R仍在,但主入口已是analysis/01_screen.R。
⚠️ 跑长任务别用
wsl -e bash -lc "... &":后台任务会随父 shell 退出被杀。 用setsid nohup ~/脚本.sh &,或直接在 RStudio Terminal 里跑。
下游分析
bash
Rscript analysis/03_phewas.R # PheWAS 脱靶扫描
Rscript analysis/05_hyprcoloc.R R9 # HyPrColoc 共定位
Rscript analysis/04_ldsc.R R13 # LDSC 遗传相关
./run_pipeline.sh # 串行链:HyPrColoc R9 → R13 → LDSC R13(幂等,可断点续跑)四、更新到新版 FinnGen(如 R13/R14)要准备数据
流水线 MR 只需工具SNP那几千行,但预过滤前要先有全量文件。推荐流程:
- 在 Windows 侧挂代理直接下载全量
.gz到D:\mrdata\outcome\(Windows 已配系统代理 127.0.0.1:10809,浏览器/下载器直连 FinnGen 的 Google 存储,快且稳)。 - 不用改任何路径——
data/outcome已经软链到/mnt/d/mrdata/outcome,下到那儿就能读到。 - 在
outcome_manifest.csv里加一行(release / id / 文件名 / 病例数 / 对照数 / …)。 Rscript analysis/01_screen.R R13(断点续跑,只算新加的结局)。
为什么不在 WSL 里下:WSL 是 NAT 网络,够不到 Windows 的 localhost 代理; 在 Windows 下、WSL 经
/mnt/d读最省事。
四点五、代码同步
链路:F 盘(真源) →git→ WSL(执行机) →mrsync→ 腾讯云(随身入口)
铁律:代码只在 F 盘改,另外两处只拉不改
bash
# ① F 盘改完代码(Windows 任意终端)
cd F:/project/mr-pipeline
git add -A && git commit -m "fix: 说清楚改了什么"
# ② WSL 拉下来跑
cd ~/mr-pipeline && git pull
Rscript analysis/01_screen.R R9
# ③ 需要时推腾讯云(在 WSL 里)
~/mrsync.sh diff # 先看差异
~/mrsync.sh push --go # 真推(不加 --go 只预演)检查某台机器有没有跑偏
四个项目一起查(2026-07-26 起)——只查 mr-pipeline 会漏掉另外三个:
bash
for p in mr-pipeline multiomics-mr dr-amd-targets decode-rep; do
printf '%-16s ' "$p"
git -C "/home/research/$p" fetch -q origin 2>/dev/null
mod=$(git -C "/home/research/$p" status --porcelain --untracked-files=no | wc -l)
unt=$(git -C "/home/research/$p" status --porcelain | grep '^??' \
| grep -cE '\.(R|py|sh|yaml)$')
beh=$(git -C "/home/research/$p" rev-list --count HEAD..origin/main 2>/dev/null)
echo "已改 $mod | 未跟踪代码 $unt | 落后 $beh 个提交"
done判读:
- 全
0→ 与真源一致,放心跑 - 落后 > 0 → F 盘有新改动,
git pull - 已改 > 0 → 有人在执行机上直接改了代码,必须回迁 F 盘再提交
- 未跟踪代码 > 0 → ⚠️ 最危险的一类:新写的脚本从未入库,只要 WSL 出问题就没了
这个自检不是理论演练
2026-07-26 第一次跑这个检查,mr-pipeline 就查出 17 个已改 + 11 个未跟踪代码文件—— 包含产出当前全部结果的「分家」实现、分析阶段 17–21、以及 docs 已引用为证据的两个独立复算脚本。 当时若换机只拷 F 盘,一个结果都复现不出来。 详见本页上方的红框。
建议:每次跑批前、以及任何"很久没动"之后,先跑一次这个循环。
查历史
bash
git log --oneline # 改动流水
git log -p R/01_config.R # 某文件的完整变更史为什么腾讯云不用 git
ssh 进腾讯云是 ubuntu 用户但流水线文件属 research,git push 无法像 rsync 那样 sudo 提权;且腾讯云在网络上够不着 F 盘。故继续用 mrsync.sh(只同步代码, 自动跳过 data/、results/、reference/、大文件;只增改不删除)。
完整版(含翻车恢复、环境陷阱)见仓库内
docs/代码同步与版本管理.md。
为什么要有这套东西
2026-07-17 查明的真实事故:三份副本自 07-12 起就是互不知情的独立拷贝, 而 mrsync.sh 只管「WSL ↔ 腾讯云」,F 盘和 WSL 之间从来没有任何同步机制。 后果是 07-14 在 F 盘给引擎加的 LD 面板祖先一致性校验(assert_ld_ancestry_match) 四天没进 WSL——而 WSL 正是跑批的地方,那个已写进本文档的校验闸门一次都没生效过。
根因:代码编辑天然发生在 F 盘(编辑器、文档发布都在那),改既有文件时只落 F 盘; 只有新建文件时才会想起两边都写。所以分叉形态是「新文件到处都有、老文件只有 F 盘新」, 极其隐蔽,只能逐个比 md5 才发现。git 解决的正是这个:git status 一秒钟告诉你有没有偏离。
五、维护要点
- 停/起 RStudio:WSL 里
sudo systemctl restart rstudio-server - 隧道状态:
systemctl status mr-tunnel(autossh 自动重连) - 改密码:
sudo passwd research(RStudio 登录);basic auth 改/etc/caddy/Caddyfile里 mr.stlog.cn 段 - 分子动力学(lovejj 用户 + conda gmxmd/cgenff/md)与本环境完全隔离,互不影响