gpt4 book ai didi

r - 更改密度直方图的 binwidth 以使概率总和为 1

转载 作者:行者123 更新时间:2023-12-01 18:39:37 25 4
gpt4 key购买 nike

我已经发现了很多问题,但不知何故它并没有真正帮助我。我不明白如何更改 ggplot2 中密度直方图中的 binwidth,以便概率总和为 1。似乎只有当 binwidth 恰好为 1 时它才有效。这是一个例子:

set.seed(1)
df = data.frame("data" = runif(1000, min=0, max=100))

a = ggplot(data = df, aes(x = data))+
geom_histogram(aes(y=..density..),colour="black", fill = "white",
breaks=seq(0, 100, by = 50))


b = ggplot(data = df, aes(x = data))+
geom_histogram(aes(y =..density..),
breaks=seq(0, 100, by = 30),
col="black",
fill="white")
c = ggplot(data = df, aes(x = data))+
geom_histogram(aes(y =..density..),
breaks=seq(0, 100, by = 10),
col="black",
fill="white")

d = ggplot(data = df, aes(x = data))+
geom_histogram(aes(y =..density..),
breaks=seq(0, 100, by = 1),
col="black",
fill="white")

grid.arrange(a,b,c,d, ncol= 2)

如果你看一下概率轴,你会发现前三张图一定是错误的。这些不是正确的直方图,因为箱的总和不等于 1。根据直方图 a、b、c 或 d,y 轴甚至没有显着变化。我还尝试用“binwidth”命令替换“breaks”命令,但情况更糟。我还想知道如何计算直方图的单个 bin 的概率来证明它的总和是否为 1?

感谢您的帮助。

最佳答案

模拟一些数据:

library(ggplot2)
library(dplyr)

set.seed(1)
df = data.frame("data" = runif(1000, min=0, max=100))

您可以获得的第一个图是:

# y axis has the density estimate values 
ggplot(data = df, aes(x = data))+
geom_histogram(aes(y=..density..),colour="black", fill = "white",
breaks=seq(0, 100, by = 50))

enter image description here

该图在 y 轴上具有密度估计值。这些值对应于密度图,而不是您创建的条形图。您可以看到这个版本,其中密度图被覆盖:

# y axis has the density estimate values and the density plot
ggplot(data = df, aes(x = data))+
geom_histogram(aes(y=..density..),colour="black", fill = "white",
breaks=seq(0, 100, by = 50)) +
geom_density(aes(data), col="red")

enter image description here解释这一点的一种方法是,红线上的每个点都有一个被选择的概率,并且位于 y 轴上(即很多点意味着概率趋于接近于零)。

你可以通过这个得到你想要的:

# y axis has the probabilities of each bar (bar counts / all counts)
ggplot(data = df, aes(x = data))+
geom_histogram(aes(y=..count../sum(..count..)),colour="black", fill = "white",
breaks=seq(0, 100, by = 50))

enter image description here

在保留数据(以供将来使用或仅检查概率总和为 1)的同时执行上述操作的另一种方法是:

# assign the breaks
breaks = cut(df$data, seq(0, 100, by = 50))

# count observations in each bar and probability of each bar
df %>%
mutate(Breaks = breaks) %>%
count(Breaks) %>%
mutate(Prc = n/sum(n))

# # A tibble: 2 x 3
# Breaks n Prc
# <fctr> <int> <dbl>
# 1 (0,50] 520 0.52
# 2 (50,100] 480 0.48

# plot the above
df %>%
mutate(Breaks = breaks) %>%
count(Breaks) %>%
mutate(Prc = n/sum(n)) %>%
ggplot(aes(Breaks, Prc)) + geom_col()

enter image description here

关于r - 更改密度直方图的 binwidth 以使概率总和为 1,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47653473/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com