假设我有这个数组A:
array([ 0.0019879 , -0.00172861, -0.00527226, 0.00639585, -0.00242005,
-0.00717373, 0.00371651, 0.00164218, 0.00034572, -0.00864304,
-0.00639585, 0.006828 , 0.00354365, 0.00043215, -0.00440795,
0.00544512, 0.00319793, 0.00164218, 0.00025929, -0.00155575,
0.00129646, 0.00259291, -0.0039758 , 0.00328436, 0.00207433,
0.0011236 , 0.00440795, 0.00164218, -0.00319793, 0.00233362,
0.00025929, 0.00017286, 0.0008643 , 0.00363008])
如果我跑:
np.histogram(A, bins=9, density=True)
我得到了:
array([ 34.21952021, 34.21952021, 34.21952021, 34.21952021,
34.21952021, 188.20736116, 102.65856063, 68.43904042,
51.32928032])
手册说:
“如果为True,则结果为概率密度函数的值 在bin处,归一化使得该范围内的积分为1。 请注意,直方图值的总和不等于1 除非选择了单位宽度的箱子;它不是概率质量 功能“。
我认为我对直方图和密度函数有很好的理解,但我真的不明白这些值代表什么或如何计算它们。
我需要用R重现这些值,因为我在两种语言之间移植了一些代码。
答案 0 :(得分:1)
在R中,您可以使用hist()
函数绘制直方图。此外,hist
是一个生成列表的S3
函数。
A <- c(0.0019879 , -0.00172861, -0.00527226, 0.00639585, -0.00242005,
-0.00717373, 0.00371651, 0.00164218, 0.00034572, -0.00864304,
-0.00639585, 0.006828 , 0.00354365, 0.00043215, -0.00440795,
0.00544512, 0.00319793, 0.00164218, 0.00025929, -0.00155575,
0.00129646, 0.00259291, -0.0039758 , 0.00328436, 0.00207433,
0.0011236 , 0.00440795, 0.00164218, -0.00319793, 0.00233362,
0.00025929, 0.00017286, 0.0008643 , 0.00363008)
以下是R使用向量A
生成的默认直方图。
hist(A)
这是直方图,其中包含密度曲线的附加图层。
hist(A, freq = F)
lines(density(A), col = 'red')
让我们将列表hist(A)
存储到p
。
p <- hist(A)
我们现在可以看到列表p
的内容。
str(p)
# List of 6
# $ breaks : num [1:10] -0.01 -0.008 -0.006 -0.004 -0.002 0 0.002 0.004 # 0.006 0.008
# $ counts : int [1:9] 1 2 2 3 2 12 8 2 2
# $ density : num [1:9] 14.7 29.4 29.4 44.1 29.4 ...
# $ mids : num [1:9] -0.009 -0.007 -0.005 -0.003 -0.001 0.001 0.003 0.005 0.007
# $ xname : chr "A"
# $ equidist: logi TRUE
# - attr(*, "class")= chr "histogram"
density
是指理论密度函数值。这可能超过1,但密度曲线下的面积应该等于1.每个条的宽度很容易通过直方图中条形的断点(breaks
)之间的差异来确定。因此,如果我们将直方图的每个条的宽度乘以p$density
,并添加结果,我们应该得到1的总和。
sum(diff(p$breaks) * p$density)
# [1] 1