Gnuplot:平滑k密度第二列的含义

问题描述 投票:0回答:1

我是 gnuplot 新手。我对使用 gnuplot 支持的高斯函数(使用“平滑 k密度”)进行内核密度重采样也很陌生。我使用了下面提供的 gnuplot 演示脚本。我试图理解第二列 $k密度1 的含义是什么。如果我打印 $k密度1 我会得到这些值:

(...)
140.76 13.1663 13.1663
146.032 12.5092 12.5092 我
151.304 11.6501 11.6501
156.575 10.6298 10.6298
161.847 9.5347 9.5347
167.119 8.48325 8.48325
172.391 7.56657 7.56657
177.662 6.80631 6.80631
(...)

第一列似乎是根据随机表达式提供的 $viol1 第二列定义的样本值计算出的高斯核。但我试图理解 $k密度1 的第二列是如何计算的,因为它定义了“密度”或小提琴图的分布。似乎假设 $2/20.0 计算中的 20.0 常数。但考虑到另一个具有不同范围的样本集,这个值肯定是不同的。因此,$k密度1的第2列是如何计算的(或者它的关系是什么)以及如何找到用于计算扩散的常数(20)?

nsamp = 3000 
set print $viol1
do for [i=1:nsamp] {
    y = (i%4 == 0) ? 300. +  70.*invnorm(rand(0)) \
      : (i%4 == 1) ? 400. +  10.*invnorm(rand(0)) \
      :              120. +  40.*invnorm(rand(0))
    print sprintf(" 35.0 %8.5g", y)
}
unset print

set title "kdensity mirrored sideways to give a violin plot"

set table $kdensity1
plot $viol1 using 2:(1) smooth kdensity bandwidth 10. with filledcurves above y lt 9 title 'B'
unset table

set border 2
unset margins
unset xtics
set ytics nomirror rangelimited

set xrange [-1:5]
plot  $kdensity1 using (3 + $2/20.):1 with filledcurve x=3 lt 9 notitle, '' using (3 - $2/20.):1 with filledcurve x=3 lt 9 notitle

statistics gnuplot kernel-density
1个回答
0
投票

您指的是这个小提琴情节演示。查看 Wikipedia Kernel_(statistics) 和 gnuplot

help kdensity
:

“平滑 k 密度”选项使用高斯核生成并绘制核密度估计值,以获取一组值的分布。值取自第一个数据列,可选权重取自第二列。在每个点的位置放置一个高斯函数,并将所有这些高斯函数的总和绘制为函数。为了获得归一化直方图,每个权重应为 1/点数。 ...

并查看进一步最小化的示例。

输入数据
    $Data
  • 只需要一列数据
    当使用选项 
  • smooth kdensity
  • 绘制到表格时,
    (1)
    部分是该数据点的权重,这里是
    1
    的常量值(因为有括号)。正如
    help kdensity
    所建议的,您可以使用
    (1/N)
    代替,其中
    N
    是获得归一化小提琴图的点数。
    我不明白为什么原始示例使用 
  • with filledcurves above y lt 9 title 'B'
  • 将其绘制到表格中。这会生成不必要的第三列,该列与第二列相同。
    
    
  • 据我了解,对于每个数据点,都会有一个具有给定宽度和面积 1 的高斯核。您可以对所有高斯函数求和,从而得到
$kdensity

第二列中的曲线形状。

关于

$2/20.

,我猜,示例中的这个因素

20.
只是两个小提琴图在图中不会碰撞的缩放因子。
为了自动找出合理的缩放因子,您可以执行 

stats

来获取数据块第二列的最大值

$kdensity
。 如果您想比较几个小提琴图,您应该将所有最大值中的最大值作为比例因子。
绘图命令中的 

3 +

3 - 
只是镜像小提琴图的 x 偏移。

脚本:

### violin plot reset session $Data <<EOD 1.0 2.0 4.0 1.0 2.0 2.0 EOD N = |$Data| set table $kdensity plot $Data u 1:(1) smooth kdensity bandwidth 0.2 unset table stats [*:*][*:*] $kdensity u 2 print STATS_max, STATS_min set key noautotitle set xrange[1:5] set yrange[0:5] plot $kdensity u (3 + $2/STATS_max):1 w filledcurve x=3 lt 9, \ '' u (3 - $2/STATS_max):1 w filledcurve x=3 lt 9 ### end of script

结果:

© www.soinside.com 2019 - 2024. All rights reserved.