You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

伯努利随机变量似然与对数似然函数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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.23 14:15:05