# 類別變數 (多PRSmix.方法)
# prs_wt <- read.delim(
# "C:/Users/yuting/Desktop/TPMI_GWAS_Stats/PRS_Weight/250.2_prs_weights.tsv",
# stringsAsFactors = FALSE)
# dim(prs_wt) # 1022838 7
#
# all156 <- read.delim(
# "C:/Users/yuting/Desktop/TPMI_GWAS_Stats//GWAS_Stats/250.2_all.156.txt",
# stringsAsFactors = FALSE)
# dim(all156) # 1739048 17
# all156$ES = log(all156$OR)
# all156_subset <- all156[, c("rsID", "X.CHROM", "POS", "A1", "OMITTED", "ES","P")]
#
# prs_merged <- merge(
# prs_wt,
# all156_subset,
# by.x = "MarkerID",
# by.y = "rsID",
# all.x = TRUE
# )
# dim(prs_merged) # 1022838 11
# prs_merged$ID <- paste0(prs_merged$X.CHROM, ":", prs_merged$POS)
# prs_merged <- prs_merged[!is.na(prs_merged$X.CHROM), ]
#
# prs_methods <- c("LDpred2", "Lassosum2", "PRS.CS", "SBayesR", "MegaPRS","PRSmix.")
#
# # ======================================
# # 3️⃣ 生成各方法 effect allele,並翻轉 beta
# # ======================================
# for (m in prs_methods) {
#
# ea_col <- paste0("EA_", m)
# beta <- prs_merged[[m]]
#
# # 預設 effect allele = Effect_Allele
# prs_merged[[ea_col]] <- prs_merged$Effect_Allele
#
# # beta < 0 的 SNP
# idx <- which(!is.na(beta) & beta < 0)
#
# if (length(idx) > 0) {
# # 翻轉 effect allele:選擇 A1 / OMITTED 中不等於 Effect_Allele 的
# alt <- ifelse(
# prs_merged$A1[idx] != prs_merged$Effect_Allele[idx],
# prs_merged$A1[idx],
# prs_merged$OMITTED[idx]
# )
# prs_merged[[ea_col]][idx] <- alt
#
# # 翻正 beta
# prs_merged[[m]][idx] <- -prs_merged[[m]][idx]
# }
# }
#
# # ======================================
# # 4️⃣ ES 處理(只看 A1 / OMITTED)
# # ======================================
# prs_merged$GWAS_ES <- prs_merged$A1
# idx_es <- which(!is.na(prs_merged$ES) & prs_merged$ES < 0)
#
# prs_merged$ES[idx_es] <- -prs_merged$ES[idx_es]
# prs_merged$GWAS_ES[idx_es] <- prs_merged$OMITTED[idx_es]
#
# # ======================================
# # 5️⃣ 安全檢查
# # ======================================
# stopifnot(
# all(prs_merged$A1 != prs_merged$OMITTED) # 確保兩個 allele 不同
# )
#
# # ======================================
# # 6️⃣ 輸出各方法 score 檔(可直接用 PLINK2)
# # ======================================
# for (m in prs_methods) {
# out <- prs_merged[, c("ID", paste0("EA_", m), m)]
# colnames(out) <- c("ID", "A1", "BETA")
# write.table(
# out,
# file = paste0("score_", m, ".txt"),
# sep = "\t",
# quote = FALSE,
# row.names = FALSE
# )
# }
#
# names(prs_merged)
# prs_merged = prs_merged[,c(15,22,13,14,16,3,17,4,18,5,19,6,20,7,21,8,1,9,10)]
# names(prs_merged)
#
#
# write.table(
# prs_merged,
# file = "C:/Users/yuting/Desktop/TPMI_GWAS_Stats/250.2_prs_weights_risk_PRS.txt",
# sep = "\t",
# quote = FALSE,
# row.names = FALSE
# )
#
#
#
#
# # 數值變數
# prs_wt <- read.delim(
# "C:/Users/yuting/Desktop/TPMI_GWAS_Stats/PRS_Weight/BUN_prs_weights.tsv",
# stringsAsFactors = FALSE)
# dim(prs_wt) # 1022838 7
#
# all156 <- read.delim(
# "C:/Users/yuting/Desktop/TPMI_GWAS_Stats//GWAS_Stats/BUN_all.156.txt",
# stringsAsFactors = FALSE)
# dim(all156) # 1739048 17
# # all156$ES = log(all156$OR)
# all156_subset <- all156[, c("rsID", "X.CHROM", "POS", "A1", "OMITTED", "BETA","P")]
#
# prs_merged <- merge(
# prs_wt,
# all156_subset,
# by.x = "MarkerID",
# by.y = "rsID",
# all.x = TRUE
# )
# dim(prs_merged) # 1022838 11
# prs_merged$ID <- paste0(prs_merged$X.CHROM, ":", prs_merged$POS)
# prs_merged <- prs_merged[!is.na(prs_merged$X.CHROM), ]
#
# prs_methods <- c("LDpred2", "Lassosum2", "PRS.CS", "SBayesR", "MegaPRS","PRSmix.")
#
# # ======================================
# # 3️⃣ 生成各方法 effect allele,並翻轉 beta
# # ======================================
# for (m in prs_methods) {
#
# ea_col <- paste0("EA_", m)
# beta <- prs_merged[[m]]
#
# # 預設 effect allele = Effect_Allele
# prs_merged[[ea_col]] <- prs_merged$Effect_Allele
#
# # beta < 0 的 SNP
# idx <- which(!is.na(beta) & beta < 0)
#
# if (length(idx) > 0) {
# # 翻轉 effect allele:選擇 A1 / OMITTED 中不等於 Effect_Allele 的
# alt <- ifelse(
# prs_merged$A1[idx] != prs_merged$Effect_Allele[idx],
# prs_merged$A1[idx],
# prs_merged$OMITTED[idx]
# )
# prs_merged[[ea_col]][idx] <- alt
#
# # 翻正 beta
# prs_merged[[m]][idx] <- -prs_merged[[m]][idx]
# }
# }
#
# # ======================================
# # 4️⃣ ES 處理(只看 A1 / OMITTED)
# # ======================================
# prs_merged$GWAS_ES <- prs_merged$A1
# idx_es <- which(!is.na(prs_merged$BETA) & prs_merged$BETA < 0)
#
# prs_merged$BETA[idx_es] <- -prs_merged$BETA[idx_es]
# prs_merged$GWAS_ES[idx_es] <- prs_merged$OMITTED[idx_es]
#
# # ======================================
# # 5️⃣ 安全檢查
# # ======================================
# stopifnot(
# all(prs_merged$A1 != prs_merged$OMITTED) # 確保兩個 allele 不同
# )
#
# # ======================================
# # 6️⃣ 輸出各方法 score 檔(可直接用 PLINK2)
# # ======================================
# for (m in prs_methods) {
# out <- prs_merged[, c("ID", paste0("EA_", m), m)]
# colnames(out) <- c("ID", "A1", "BETA")
# write.table(
# out,
# file = paste0("score_", m, ".txt"),
# sep = "\t",
# quote = FALSE,
# row.names = FALSE
# )
# }
#
# names(prs_merged)
# prs_merged = prs_merged[,c(15,22,13,14,16,3,17,4,18,5,19,6,20,7,21,8,1,9,10)]
#
#
# write.table(
# prs_merged,
# file = "C:/Users/yuting/Desktop/TPMI_GWAS_Stats/BUN_prs_weights_risk_PRS.txt",
# sep = "\t",
# quote = FALSE,
# row.names = FALSE
# )
############################
## Load libraries
############################
library(dplyr)
## Warning: 套件 'dplyr' 是用 R 版本 4.4.3 來建造的
##
## 載入套件:'dplyr'
## 下列物件被遮斷自 'package:stats':
##
## filter, lag
## 下列物件被遮斷自 'package:base':
##
## intersect, setdiff, setequal, union
library(ggplot2)
## Warning: 套件 'ggplot2' 是用 R 版本 4.4.3 來建造的
############################
## Input files (each PRS method)
############################
files <- c(
Paper = "C:/Users/yuting/Desktop/temp/hg38_risk_PRS_Paper.chrALL.score.Merge.txt",
MegaPRS = "C:/Users/yuting/Desktop/temp/hg38_risk_PRS_MegaPRS.chrALL.score.Merge.txt",
Lassosum2 = "C:/Users/yuting/Desktop/temp/hg38_risk_PRS_Lassosum2.chrALL.score.Merge.txt",
LDpred2 = "C:/Users/yuting/Desktop/temp/hg38_risk_PRS_LDpred2.chrALL.score.Merge.txt",
SBayesR = "C:/Users/yuting/Desktop/temp/hg38_risk_PRS_SBayesR.chrALL.score.Merge.txt",
PRS_CS = "C:/Users/yuting/Desktop/temp/hg38_risk_PRS_PRS_CS.chrALL.score.Merge.txt"
)
############################
## Read & merge all methods
############################
df_all <- bind_rows(
lapply(names(files), function(m) {
df <- read.table(files[m], header = TRUE)
df$Method <- m
df
})
)
############################
## Z-score standardization
## (done separately per method)
############################
df_all <- df_all %>%
group_by(Method) %>%
mutate(Score_z = as.numeric(scale(PRS_SUM))) %>%
ungroup()
############################
## Prepare legend labels
############################
n_df <- df_all %>%
distinct(V1, Group) %>%
count(Group)
labels <- setNames(
paste0(n_df$Group, " (n = ", n_df$n, ")"),
n_df$Group
)
############################
## Force Paper on top & custom label
############################
# 先設定 Method 順序
df_all$Method <- factor(df_all$Method,
levels = c("Paper", "MegaPRS", "Lassosum2", "LDpred2", "SBayesR", "PRS_CS"))
# 自訂 facet 標籤
method_labels <- c(
"Paper" = "Ho, Weang-Kee, et al. Nature communications 11.1 (2020): 3833",
"MegaPRS" = "MegaPRS (TPMI PheWeb 174.1)",
"Lassosum2" = "Lassosum2 (TPMI PheWeb 174.1)",
"LDpred2" = "LDpred2 (TPMI PheWeb 174.1)",
"SBayesR" = "SBayesR (TPMI PheWeb 174.1)",
"PRS_CS" = "PRS-CS (TPMI PheWeb 174.1)"
)
############################
## Plot: all methods together (Paper on top with custom title)
############################
ggplot(df_all, aes(x = Score_z, fill = Group)) +
geom_density(alpha = 0.5, color = NA) +
facet_wrap(~ Method, ncol = 1, labeller = labeller(Method = method_labels)) + # 用自訂標籤
theme_classic() +
labs(
x = "Standardized PRS (Z-score)",
y = "Density",
title = "Standardized PRS Distribution",
fill = "Group"
) +
scale_fill_manual(
values = c("Case" = "#E64B35", "Control" = "#4DBBD5"),
labels = labels
) +
theme(
plot.title = element_text(size = 18, face = "bold", hjust = 0.5),
strip.text = element_text(size = 14, face = "bold"),
axis.title.x = element_text(size = 14),
axis.title.y = element_text(size = 14),
axis.text.x = element_text(size = 12),
axis.text.y = element_text(size = 12),
legend.title = element_text(size = 14, face = "bold"),
legend.text = element_text(size = 13),
legend.background = element_blank(),
legend.key = element_blank(),
panel.spacing = unit(1, "lines") # panel 間距,直排時很好用
)
