Возвращением от 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))
.
Компоненты x
и y
образуют кривую плотности, которую можно построить с помощью plot(dA$x, dA$y)
.Вы можете подумать, что все, что вам нужно сделать, это добавить y
значения из двух density
объектов, но нет гарантии, что они будут в одинаковых x
точках.
Так что, возможно, вы думаете, что можете интерполироватьодин к тем же x
пунктам и затем добавьте y
значения.Но это не будет интегрироваться в 1, как должная плотность, поэтому вы должны масштабировать dA$y
и dB$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))
.