伯努利随机变量似然与对数似然函数R绘图及optimize异常求助
问题排查与修复方案
核心错误原因
- 似然函数计算逻辑错误:伯努利分布的原始似然是所有样本观测概率的乘积,而非求和。对数似然用
sum()是正确的(对数变换将乘积转换为求和),但你计算lik[i]时错误使用了sum(),导致数值完全不符合似然定义。 optimize()函数传参错误:该函数第一个参数要求传入可调用的函数对象,你传入了提前计算好的数值向量lik/loglik,因此无法正常运行。- 次要不规范问题:似然函数绘图的
ylab参数错误标注为对数似然的标识,且参数列表中存在多余的逗号。
另外补充:多样本似然乘积的数值通常极小,容易出现数值下溢问题,更稳定的计算方式是通过对数似然取指数得到原始似然值。
修复后可正常运行的完整代码
# 加载数据 data(quilpie, package = "GLMsData") mu = seq(0.01, 0.99, length.out = 100L) loglik = NULL lik = NULL for (i in 1:length(mu)) { loglik[i] <- sum(dbinom(quilpie$y, size = 1, prob = mu[i], log = TRUE)) # 用对数似然转原始似然,更稳定,等价于prod(dbinom(...)) lik[i] <- exp(loglik[i]) } # 绘制似然函数图 plot(mu, lik, type = "l", lwd = 2, xlab = expression(mu), main = "Likelihood function", ylab = expression(paste("L(", mu, ")"))) abline(v = mu[which.max(lik)], lwd = 3, lty = 2) # optimize传参改为匿名函数 lik_opt <- optimize(function(m) exp(sum(dbinom(quilpie$y, size = 1, prob = m, log = TRUE))), lower = 0.01, upper = 0.99, maximum = TRUE) abline(v = lik_opt$max) print("似然函数最优解:") print(lik_opt) print("网格搜索得到的似然最优mu:") print(mu[which.max(lik)]) # 绘制对数似然函数图 plot(mu, loglik, type = "l", lwd = 2, xlab = expression(mu), main = "Log-likelihood function", ylab = expression(paste("logL(", mu, ")"))) abline(v = mu[which.max(loglik)], lwd = 3, lty = 2) # 对数似然优化也传入匿名函数 loglik_opt <- optimize(function(m) sum(dbinom(quilpie$y, size = 1, prob = m, log = TRUE)), lower = 0.01, upper = 0.99, maximum = TRUE) abline(v = loglik_opt$max) print("对数似然函数最优解:") print(loglik_opt) print("网格搜索得到的对数似然最优mu:") print(mu[which.max(loglik)])
内容的提问来源于stack exchange,提问作者Quamena
相关产品推荐
相关产品推荐

