首先,先对原始数据做直方图。
一、根据直方图,然后根据直方图偏左还是偏右进行log或者e(x)矫正。
log10代码
# ===================== 你的路径 =====================
setwd("D:/1、博士期间/9、博士-实验以及项目/12、根腐病GWAS/1、表型填补及正态分布分析")
# ===================== 读取你的表型文件 =====================
dat <- read.delim("表型作直方图文件20260330.txt",
sep = "\t",
row.names = 1,
check.names = FALSE,
stringsAsFactors = FALSE)
# ===================== 对 所有数据 进行 log10 矫正 =====================
# +1 防止0值无法计算对数
dat_log <- log10(dat + 1)
# ===================== 输出矫正后的文件 =====================
write.table(dat_log,
"表型数据_全文件_log10矫正后.txt",
sep = "\t",
row.names = TRUE,
quote = FALSE)
# ===================== 运行完成 =====================
cat("✅ 全部数据 log10 矫正完成!\n")
cat("✅ 文件已保存:表型数据_260330_log10矫正后.txt\n")
二、利用RINT进行矫正
这个矫正只能用于关联分析,以及相关性分析,并不具备生物学意义
参考论文:From genotype to phenotype with 1,086 near telomere-to-telomere yeast genomes
https://www.nature.com/articles/s41586-025-09637-0
代码:
# ===================== 1. 你的工作路径 + 读取文件(完全一致) =====================
setwd("D:/1、博士期间/9、博士-实验以及项目/12、根腐病GWAS/1、表型填补及正态分布分析")
dat <- read.delim("表型作直方图文件20260330.txt",
sep = "\t",
row.names = 1,
check.names = FALSE,
stringsAsFactors = FALSE)
# ===================== 2. 你提供的 RINT 矫正函数(原样保留) =====================
rank.based.INT <- function(x, c=3/8, method="average")
{
# 秩逆正态变换(GWAS表型矫正标准方法)
r <- rank(x, ties.method = method)
r[is.na(x)] <- NA
N <- length(x[!is.na(x)])
qnorm((r-c)/(N-2*c+1))
}
# ===================== 3. 正态检验函数 =====================
shapiro_test <- function(x){
x <- na.omit(x)
if(length(x) >= 3 && length(x) <= 5000){
return(shapiro.test(x)$p.value)
} else {
return(NA)
}
}
# ===================== 4. 自动流程:检验 → 不符合则 RINT 矫正 =====================
cat("===== 开始表型正态检验 + RINT 矫正 =====\n\n")
# 创建结果表格
final_dat <- dat
# 循环处理每一列
for(col in colnames(dat)){
x <- dat[[col]]
p_raw <- shapiro_test(x)
cat("========================================\n")
cat("指标:", col, "\n")
cat("原始正态检验 p =", round(p_raw, 6), "\n")
if(p_raw >= 0.05){
cat("✅ 符合正态,不矫正\n")
final_dat[[col]] <- x # 保留原始数据
} else {
cat("❌ 不符合正态,执行 RINT 矫正\n")
final_dat[[col]] <- rank.based.INT(x) # RINT矫正
p_corrected <- shapiro_test(final_dat[[col]])
cat("✅ RINT矫正后 p =", round(p_corrected, 6), "\n")
}
}
# ===================== 5. 输出最终矫正文件 =====================
write.table(final_dat, "表型数据_正态检验+RINT矫正后.txt",
sep = "\t", row.names = TRUE, quote = FALSE)
cat("\n========================================\n")
cat("🎉 全部完成!\n")
cat("✅ 输出文件:表型数据_2603330_RINT矫正后.txt\n")
cat("✅ 该数据可直接用于 GWAS、线性模型、直方图绘图\n")