如何计算R语言中拟合自定义正态分布函数的参数a和b?
如何确定自定义正态密度函数的参数a和b
嘿,我来帮你搞定这个参数估计的问题~首先看你的代码,你用rnorm(1000)生成了数据集,然后写了自定义的正态密度函数dfun,想知道怎么给a和b选合适的值对吧?
其实你的dfun完全对应正态分布的密度公式:参数a就是正态分布的均值(μ),b就是标准差(σ)。这里有两种简单靠谱的方法来确定它们:
方法1:直接用样本的均值和标准差
最直观的方式就是从你生成的数据里直接计算均值和标准差,这是正态分布参数的无偏估计:
# 计算参数a(均值)和b(标准差) a_est <- mean(dataset$X) b_est <- sd(dataset$X)
然后把这两个值代入stat_function的参数里就行,修改后的完整代码是:
library(ggplot2) set.seed(1) dataset <- data.frame(X = rnorm(1000)) dfun <- function(x, a, b) 1/(sqrt(2*pi)*b)*exp(-0.5*((x-a)^2/(2*b^2))) # 计算参数 a_est <- mean(dataset$X) b_est <- sd(dataset$X) ggplot(dataset, aes(x = X)) + geom_histogram(aes(y = ..density..), binwidth = 0.5, alpha = 0.5) + stat_function(fun = dfun, args = list(a = a_est, b = b_est), color = "red", size = 1)
方法2:用最大似然估计(MLE)拟合
如果想更严谨地用统计方法推导参数,可以用最大似然估计。R里的MASS包提供了fitdistr函数,能直接拟合分布参数:
library(MASS) # 拟合正态分布的MLE参数 fit_result <- fitdistr(dataset$X, "normal") a_mle <- fit_result$estimate["mean"] b_mle <- fit_result$estimate["sd"]
把a_mle和b_mle代入代码就行,结果和方法1几乎完全一致——因为正态分布的MLE估计值就是样本均值和标准差。
另外提个小建议:其实R里已经内置了正态密度函数dnorm(),你完全可以用它代替自己写的dfun,代码会更简洁:
ggplot(dataset, aes(x = X)) + geom_histogram(aes(y = ..density..), binwidth = 0.5, alpha = 0.5) + stat_function(fun = dnorm, args = list(mean = a_est, sd = b_est), color = "red", size = 1)
因为你设置了set.seed(1),生成的数据的均值会非常接近0,标准差接近1,代入后拟合的红色曲线会完美贴合直方图的密度分布哦~
内容的提问来源于stack exchange,提问作者P.Chakytei
相关产品推荐
相关产品推荐

