R语言绘制指数分布极大似然函数代码错误排查求助
错误说明
- 核心逻辑错误:你当前编写的
liklihood函数调用了rpois(),该函数是泊松分布随机数生成工具,和指数分布似然函数的计算完全不相关。似然函数的作用是计算给定参数theta下,观测到现有样本的概率乘积,而非生成新的随机数。 - 输入参数缺失:似然函数需要传入实际观测的样本数据才能计算对应似然值,你当前的函数仅传入theta和样本量n,没有用到实际观测的电池寿命数据,计算结果完全无意义。
- 绘图参数不合理:你设置theta的取值范围为0到30,仅取10个采样点,绘制的曲线会非常粗糙,且如果采用率参数形式的指数分布,该参数范围也不符合实际似然值的分布区间,theta=0时似然值无意义,需要避开。
修正代码
指数分布有两种常见参数化形式,你可以根据自己的定义选择对应代码:
形式1:率参数θ,Exp(θ)的概率密度为$f(x;\theta)=\theta e^{-\theta x}$,期望为$1/\theta$
# 定义指数分布似然函数 likelihood <- function(theta, obs) { n <- length(obs) sum_obs <- sum(obs) return(theta^n * exp(-theta * sum_obs)) } # 观测样本 ac <- c(3, 33, 12, 22, 23) # 调整theta取值范围,增加采样点保证平滑 theta <- seq(from = 0.001, to = 0.5, length = 200) # 计算对应似然值 L_val <- likelihood(theta, obs = ac) # 绘图 plot(theta, L_val, type = "l", xlab = expression(theta), ylab = expression(L(theta)), col = "blue", main = "极大似然函数图像") # 可选:标注极大似然估计点 mle <- 1/mean(ac) abline(v = mle, col = "red", lty = 2) text(mle + 0.02, max(L_val)*0.9, paste0("MLE≈", round(mle, 3)), col = "red")
形式2:尺度参数θ,Exp(θ)的概率密度为$f(x;\theta)=\frac{1}{\theta}e^{-x/\theta}$,期望为$\theta$(符合你原代码theta的取值范围设置)
# 定义指数分布似然函数 likelihood <- function(theta, obs) { n <- length(obs) sum_obs <- sum(obs) return((1/theta)^n * exp(-sum_obs/theta)) } # 观测样本 ac <- c(3, 33, 12, 22, 23) # 调整theta取值范围,增加采样点保证平滑 theta <- seq(from = 1, to = 50, length = 200) # 计算对应似然值 L_val <- likelihood(theta, obs = ac) # 绘图 plot(theta, L_val, type = "l", xlab = expression(theta), ylab = expression(L(theta)), col = "blue", main = "极大似然函数图像") # 可选:标注极大似然估计点 mle <- mean(ac) abline(v = mle, col = "red", lty = 2) text(mle + 1, max(L_val)*0.9, paste0("MLE≈", round(mle, 2)), col = "red")
内容的提问来源于stack exchange,提问作者Abbe
相关产品推荐
相关产品推荐

