执行以下代码时,输出图将显示f(x) = 0
的蓝线,而不是Gamma pdf(请参阅此picture中的蓝线)。
analyzeGamma <- function(csvPath, alpha, beta) {
dfSamples <- read.csv(file = csvPath,
header = TRUE,
sep = ",")
base <- ggplot(dfSamples, aes(x = value, y = quantity))
base +
geom_col(color = "red") +
geom_vline(xintercept = qgamma(seq(0.1, 0.9, by = 0.1), alpha, beta)) +
stat_function(
fun = dgamma,
args = list(shape = alpha, rate = beta),
colour = "blue"
)
}
path = "/tmp/data.csv"
alpha = 1.2
beta = 0.01
analyzeGamma(path, alpha, beta)
当我注释掉该行时:
geom_col(color = "red") +
如here所示,正确绘制了Gamma pdf。
有什么想法为什么会发生以及如何解决?
谢谢。
答案 0 :(得分:1)
这是因为您的geom_col()
上升到25,并且概率密度函数的整数为1。如果我正确地假设您的列类似于带有quantities
的计数数据的直方图,那您将调整密度以匹配列,如下所示:
密度*样本数量*列宽
如果您已预先计算了列,则“样本数”将是您所有y值的总和。
关于一些玩具数据的示例,请注意统计信息中的功能:
alpha = 1.2
beta = 0.01
df <- data.frame(x = rgamma(1000, shape = alpha, rate = beta))
binwidth <- 5
ggplot(df, aes(x)) +
geom_histogram(binwidth = binwidth) +
stat_function(
fun = function(z, shape, rate)(dgamma(z, shape, rate) * length(df$x) * binwidth),
args = list(shape = alpha, rate = beta),
colour = "blue"
)
以下带有geom_col()
的示例给出了相同的图片:
x <- table(cut_width(df$x, binwidth, boundary = 0))
newdf <- data.frame(x = seq(0.5*binwidth, max(df$x), by = binwidth),
y = as.numeric(x))
ggplot(newdf, aes(x, y)) +
geom_col(width = binwidth) +
stat_function(
fun = function(z, shape, rate)(dgamma(z, shape, rate) * sum(newdf$y) * binwidth),
args = list(shape = alpha, rate = beta),
colour = "blue"
)
答案 1 :(得分:0)
ggplot缩放y轴以显示所有数据。蓝色曲线显示为一条正比例缩放的直线-如果您在两个图表中都比较y轴的比例,则会看到:当您绘制geom_col
时,y轴最大值在25处(和stat_functions似乎是一条直线)。如果没有geom_col,则y轴最大值为0.006。