R语言中如何计算双峰分布两峰的半高全宽(FWHM)并统计各峰计数
实现方案
你已经得到了两个拟合高斯分布的mu和sigma参数,不需要从采样曲线中提取半高全宽(FWHM),可以直接用高斯分布FWHM的解析公式计算:
FWHM = 2 * sqrt(2 * ln(2)) * σ ≈ 2.3548 * σ
你可以按以下步骤实现计数统计:
前置修正
你现有绘图代码存在语法错误,可先修正避免运行报错:
原代码
ggplot(df$orientation, aes(x = orientation))应改为ggplot(df, aes(x = orientation))
步骤1:计算每个峰的FWHM和对应取值区间
library(dplyr) # 计算每个峰的FWHM、区间上下限 FIT <- FIT %>% mutate( fwhm = 2.3548 * sigma, lower = mu - fwhm/2, upper = mu + fwhm/2 )
步骤2:统计每个峰对应的样本数
如果两个峰的区间没有重叠,直接按区间筛选计数即可:
# 统计第一个峰区间内的样本数 count_peak1 <- sum(df$orientation >= FIT$lower[1] & df$orientation <= FIT$upper[1]) # 统计第二个峰区间内的样本数 count_peak2 <- sum(df$orientation >= FIT$lower[2] & df$orientation <= FIT$upper[2])
如果两个峰存在区间重叠,为了避免样本重复计数、提升统计准确性,可以通过后验概率给每个样本分配所属峰:
# 计算每个样本属于两个峰的后验概率 posterior <- data.frame( p_peak1 = FIT$lambda[1] * dnorm(df$orientation, mean = FIT$mu[1], sd = FIT$sigma[1]), p_peak2 = FIT$lambda[2] * dnorm(df$orientation, mean = FIT$mu[2], sd = FIT$sigma[2]) ) # 给每个样本分配后验概率更高的峰 df$peak <- ifelse(posterior$p_peak1 > posterior$p_peak2, 1, 2) # 输出各峰样本计数 peak_counts <- table(df$peak)
可选扩展:将FWHM区间标注到可视化图中
p + geom_vline(data = FIT, aes(xintercept = lower), color = "red", linetype = "dashed") + geom_vline(data = FIT, aes(xintercept = upper), color = "red", linetype = "dashed")
内容的提问来源于stack exchange,提问作者KrioWill
相关产品推荐
相关产品推荐

