我目前正在尝试使用 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)
<块引用>
错误:“较长的对象长度不是较短对象的倍数 长度”。
我该如何解决这个错误? 谢谢
答案 0 :(得分:0)
您的函数必须编写为处理长度 > 1 的向量,因为 stat_function
会将值向量传递给您的函数,而不是将函数分别应用于绘图上的每个 x 轴值。如果你尝试例如f_1(0:10)
你得到同样的警告,确认这个函数没有正确处理长度 > 1 的向量。问题在于z^y
。如果 z
和 y
都是向量,则行为是将 ^
应用于具有相同索引的 z
和 y
的每个元素。参见示例 (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))