You need to enable JavaScript to run this app. R语言中如何计算双峰分布两峰的半高全宽(FWHM)并统计各峰计数
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.19 05:36:01