【问题标题】:Adding two kernel density objects in R?在 R 中添加两个核密度对象?
【发布时间】:2019-02-06 08:15:46
【问题描述】:

假设我们使用 density() 函数创建了两个对象。有没有办法将这两个对象相加得到另一个密度(或相似)的对象?

例如:

A = rnorm(100)
B = rnorm(1000)
dA = density(A)
dB = density(B)
dC = density(c(A, B))

有没有办法从 dA 和 dB 对象中获取 dC 对象?求和运算之王?

【问题讨论】:

  • 这个密度是多少?混合分布的密度?

标签: r kernel-density


【解决方案1】:

来自density 的返回是包含以下部分的列表:

> str(dA)
List of 7
 $ x        : num [1:512] -3.67 -3.66 -3.65 -3.64 -3.63 ...
 $ y        : num [1:512] 0.00209 0.00222 0.00237 0.00252 0.00268 ...
 $ bw       : num 0.536
 $ n        : int 4
 $ call     : language density.default(x = A)
 $ data.name: chr "A"
 $ has.na   : logi FALSE
 - attr(*, "class")= chr "density"

请注意原始数据不在其中,因此我们无法获取它,只需执行dAB = density(c(dA$data, dB$data)) 之类的操作。

xy 分量构成密度曲线,您可以使用 plot(dA$x, dA$y) 绘制该曲线。您可能认为您需要做的就是从两个 density 对象中添加 y 值,但不能保证它们会处于相同的 x 点。

所以也许您认为您可以将一个插入到相同的x 点,然后添加y 值。但这不会像适当的密度那样集成到 1,所以你应该做的是根据每个组件密度中点的分数缩放 dA$ydB$y - 你可以从 dA$n 组件中获得.

如果您不理解最后一点,请考虑以下两种密度,一种来自 1000 点,一种来自 10 点:

dA = density(runif(1000))
dB = density(runif(500)+10)

第一个是 0 到 1 之间的制服,第二个是 10 到 11 之间的制服。两个制服的高度都是 1,它们的范围不重叠,所以如果你添加它们,你会得到两个步骤等高。但是他们工会的密度:

dAB = density(c(runif(1000), runif(500)+10))

是在 0 和 1 之间质量是 10 和 11 之间质量两倍的密度。当添加取自样本的密度时,您需要按样本大小加权。

因此,如果您可以将它们内插到相同的 x 值,然后将根据 n 值缩放的 y 值相加作为权重,您可以获得近似的结果density(c(A,B)).

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-05-26
    • 2014-12-19
    • 1970-01-01
    • 2014-07-06
    • 2018-08-24
    • 1970-01-01
    • 2020-05-19
    相关资源
    最近更新 更多