R语言绘制泊松分布对数似然图运行报错如何解决
泊松对数似然图绘制问题修复
报错原因
outer()函数参数传递错误:outer()的标准语法是outer(向量X, 向量Y, 运算函数),前两个参数为参与运算的向量,第三个参数才是要执行的函数。你直接将函数传入第二个参数,R尝试将函数(closure类型)转为向量时触发报错。- 泊松分布参数
lambda取值非法:泊松分布的lambda必须大于0,你设置的范围seq(-10,10,by=1)包含负数和0,后续计算log(lambda)会生成NaN。 - 函数内变量名笔误:函数内部定义的对数似然变量为
logLik(大写L),return语句里写的是loglik(小写l),大小写不匹配会触发对象不存在的报错。
修正后可运行代码
# 生成模拟样本 set.seed(123) sample <- rpois(50, 1.65) # 修正后的对数似然计算函数 log_like_graph <- function(lambda){ N <- length(sample) # 一维样本直接用length取样本量,无需转矩阵 logLik <- N*log(lambda) - lambda * sum(sample) return(logLik) } # 向量化函数 log_like_graph <- Vectorize(log_like_graph) # 设定合理的lambda取值范围(覆盖理论值1.65即可) lambda_vals <- seq(0.1, 5, by = 0.01) # 计算对应对数似然值:单参数场景直接调用向量化函数即可,无需使用outer log_vals <- log_like_graph(lambda_vals) # 绘制对数似然曲线 plot(lambda_vals, log_vals, type = "l", lwd = 2, col = "darkblue", xlab = "lambda", ylab = "对数似然值", main = "泊松分布对数似然曲线") # 标注极大似然估计位置(泊松分布lambda的MLE就是样本均值) abline(v = mean(sample), col = "red", lty = 2) text(mean(sample) + 0.2, max(log_vals) - 2, paste0("MLE = ", round(mean(sample), 2)), col = "red")
如果你需要沿用多参数场景的outer()写法,可以将计算对数似然的代码替换为:
log_vals <- outer(lambda_vals, FUN = log_like_graph)
内容的提问来源于stack exchange,提问作者Wu Jilong
相关产品推荐
相关产品推荐

