首页 > 解决方案 > 用 ggplot2 绘制对数似然函数的问题

问题描述

我目前正在尝试使用 ggplot2 绘制对数似然函数;函数定义为

y <- rpois(100, lambda = 3)

f_1 <- function(z) -100*z + sum(log(1/factorial(y)*z^y)).

尝试计算 f_1 的值时,一切正常(例如 f_1(1) = -316.1308)

但是当我尝试使用 ggplot2 绘制 f_1 时,会弹出一个错误:

p <- ggplot(data = data.frame(z = 0), mapping = aes(z=z))

p <- p + stat_function(fun = f_1)

错误:“较长的对象长度不是较短对象长度的倍数”。

我该如何解决这个错误?谢谢

标签: rggplot2

解决方案


您的函数必须编写为处理长度 > 1 的向量,因为stat_function会将值向量传递给您的函数,而不是将函数单独应用于绘图上的每个 x 轴值。如果你尝试例如f_1(0:10)你得到同样的警告,确认这个函数不能正确处理长度> 1的向量。问题出在z^y. 如果zy都是向量,则行为将应用于具有相同索引的每个^元素。参见例如。现在,当您尝试时会发生什么?警告告诉您长度不匹配,因此行为可能是意外的。zy(1:10)^(1:10)(1:10)^(1:20)

您可以通过使用矢量化您的函数Vectorize,这应该会给出您期望的图

p <- ggplot(data = data.frame(z = 0), mapping = aes(z=z))

p <- p + stat_function(fun = Vectorize(f_1))

推荐阅读