R语言pnorm计算比例结果一致,未调用指定数据集问题求助
问题原因与解决方法
你两次计算结果相同,不是R没使用子集数据,而是误用了pnorm()函数:
pnorm(a, mu, sigma)计算的是理论正态分布中数值小于等于a的概率。当你计算pnorm(μ+σ, μ, σ) - pnorm(μ-σ, μ, σ)时,本质是求正态分布中落在均值±1标准差范围内的理论概率,这个值是固定的0.6826895——这是正态分布的固有性质,和你输入的具体数据集的均值、标准差无关,不管用全体数据还是子集的μ和σ,结果都一样。
如果你想计算实际数据中落在该区间的比例,应该统计数据中符合条件的样本数占总样本数的比例,而非调用理论正态分布的概率函数。
修正后的代码
全体体重数据的实际比例计算
library(dplyr) bodyweights <- dat$Bodyweight mean_bodyweights <- mean(bodyweights) sd_bodyweight <- sd(bodyweights) lower_bound <- mean_bodyweights - sd_bodyweight upper_bound <- mean_bodyweights + sd_bodyweight # 用mean()统计逻辑向量的占比(TRUE=1,FALSE=0) proportion_with1sd <- mean(bodyweights >= lower_bound & bodyweights <= upper_bound) print(proportion_with1sd)
雄性对照饮食小鼠的实际比例计算
library(dplyr) male_chow_data <- dat %>% filter(Sex == "M" & Diet == "chow") y <- male_chow_data$Bodyweight mean_weight_chow <- mean(y) sd_weight_chow <- sd(y) # 若需要总体标准差,可改用popsd(y),需确保加载matrixStats等对应包 lower_bound <- mean_weight_chow - sd_weight_chow upper_bound <- mean_weight_chow + sd_weight_chow # 统计实际落在区间内的样本占比 proportion_within1sd <- mean(y >= lower_bound & y <= upper_bound) print(proportion_within1sd)
补充说明
如果你的数据近似正态分布,实际比例会接近0.68,但不会完全等于理论值——只有完美的正态分布样本才会和理论值完全一致。
内容的提问来源于stack exchange,提问作者johnathan_B
相关产品推荐
相关产品推荐

