在R中添加两个内核密度对象?

时间:2019-02-06 08:15:47

标签: r kernel-density

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

例如:

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

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

1 个答案:

答案 0 :(得分: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)进行绘制。您可能会认为,您需要做的就是从两个y对象中添加density个值,但不能保证它们将在相同的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值,然后将根据y值缩放的n值作为权重相加,则可以得到大约 density(c(A,B))