r - 用 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)
错误:“较长的对象长度不是较短对象长度的倍数”。
我该如何解决这个错误?谢谢
解决方案
您的函数必须编写为处理长度 > 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))
推荐阅读
- three.js - Calculate TBN matrix in vertex shader vs fragment shader?
- javascript - 有效地在集合中找到一个项目
- heroku - 我可以将 json-server 用于 heroku
- android - 没有文件目录:java.io.IOException:没有这样的文件或目录
- javascript - 如何在避免竞争条件的同时在 js 中读取/写入文件的确切位置
- python - Increase space between y tick and custom x axis
- angularjs - AngularJs 两个服务相互覆盖
- c# - How to reference a picker that is created in xaml when a label is clicked
- android - Nearby Connections 使用应用程序上下文做广告
- java - 合并社区并找到最大的社区