上下文是生存分析,其中我有一个阶跃函数形式的经验生存函数,它只是减去 ecdf。有没有一种标准的方法来估计pdf(曲线或直方图)?
如何从经验累积分布函数(ecdf)估计概率密度函数(pdf)?
机器算法验证
生存
密度函数
经验累积分布
2022-04-06 01:17:16
1个回答
这是一个大纲,而不是一个完整的答案。有两个主要问题:(a) 找到用于制作 ECDF 图的数据值,以及 (b) 使用直方图和 KDE 方法来估计 PDF。
示例数据:这是 R 中的一个简单演示,用于具有唯一值的样本,来自
set.seed(918); x = runif(25, 50, 7); sort(x)
set.seed(1234); x = rnorm(100, 50, 7); sort(x)
[1] 33.58012 34.73972 37.35778 38.59635 39.86257 40.26509 40.39389 40.61305 41.23610 41.55054
[11] 41.63830 41.82667 41.89534 42.02975 42.05774 42.23777 42.24877 42.51950 42.83441 42.89527
[21] 43.01129 43.03962 43.22040 43.44836 43.62163 43.76974 44.01245 44.13980 44.56622 44.58653
[31] 44.93493 45.03392 45.14396 45.31256 45.92547 45.97682 46.04884 46.17358 46.33320 46.42293
[41] 46.49119 46.52205 46.53092 46.56520 46.65965 46.67085 46.73872 46.81172 46.91616 47.18088
[51] 47.43433 47.78059 47.93994 48.03564 48.65884 48.75547 48.78349 48.81004 48.86383 48.92621
[61] 49.22800 49.62789 49.75668 49.89403 49.94677 50.04825 50.45121 50.93862 51.78637 51.80783
[71] 51.94200 52.35531 52.48885 53.00387 53.21713 53.54239 53.84998 53.94139 54.02329 54.53801
[81] 54.59612 54.88326 55.95163 56.14743 56.71646 56.81042 57.01059 57.59109 57.71608 59.30695
[91] 59.57479 60.14647 61.24137 61.53472 61.94175 62.43959 64.49190 64.84782 66.91085 67.84294
ECDF 图如下所示:
plot.ecdf(x)
查找数据值。基本思想是回收 ECDF 发生跳跃的单个数据值(“节点”)。如果 ECDF 是使用 R 制作的,则可以按如下方式找到节点:
Fn = ecdf(x); xr = knots(Fn); xr
[1] 33.58012 34.73972 37.35778 38.59635 39.86257 40.26509 40.39389 40.61305 41.23610 41.55054
[11] 41.63830 41.82667 41.89534 42.02975 42.05774 42.23777 42.24877 42.51950 42.83441 42.89527
[21] 43.01129 43.03962 43.22040 43.44836 43.62163 43.76974 44.01245 44.13980 44.56622 44.58653
..
[91] 59.57479 60.14647 61.24137 61.53472 61.94175 62.43959 64.49190 64.84782 66.91085 67.84294
如果 ECDF 的信息不在 R 中,大概您可以从您拥有的有关 ECDF 的信息中找到或估计各个值。如果有联系,则一个结可能代表多个观察值,并且该值应重复适当的次数。【如果你用‘经验分布函数的值’或‘寻找ECDF值’等关键词在网上搜索,你会发现各种回收原始数据值的方法。]
密度估计:一旦单个值被回收或估计,您可以在密度尺度上制作直方图(以便条形区域的总和是统一的),并使用“核密度估计”(KDE)来“平滑”直方图。
hist(xr, prob=T, col="skyblue2")
lines(density(xr), type="l", col="red", lwd=2) # type is 'ell', not 'one'
curve(dnorm(x, 50, 7), add=T, lty="dotted")
下图中的红色曲线显示了 R 中的默认 KDE(默认的“窗口”值)。您可以查看 R 文档和Wikipedia文章以获取有关“内核密度估计”的更多信息。[我发现所引用的 Bernard Silverman 的出版物特别有用。] 虚线显示了从中采样数据的正态分布的密度。[一般来说,对于非常大的样本,两条密度曲线会更一致。]
下图是使用来自正态分布的 1000 个样本制作的。
set.seed(918); y = rnorm(1000, 50, 7)
hist(y, prob=T, col="skyblue2")
lines(density(y), type="l", col="red", lwd=2)
curve(dnorm(x, 50, 7), add=T, lty="dotted")
其它你可能感兴趣的问题


