Как рассчитать и построить разность между двумя плотностями с разной длиной данных?

#r

Вопрос:

Предположим, у меня есть два набора данных разной длины, как показано ниже:

 df1 <- data.frame(x = rnorm(1000, 0, 2))
df2 <- data.frame(y = rnorm(500, 1, 1))
 

Я хочу рассчитать и построить график разницы в плотностях участков df1 и df2. Мне нужны значения разности, чтобы рассчитать общее/среднее значение разности между двумя плотностями.

Ответ №1:

Во-первых, рассчитайте обе плотности в их едином диапазоне u .

 u <- range(c(x, y))
dx <- density(x, from=u[1], to=u[2])
dy <- density(y, from=u[1], to=u[2])
 

Во-вторых, вычтите оценки y друг из друга.

 dd_xy <- dx$y - dy$y
 

x Все должно быть так же.

 stopifnot(all.equal(dx$x, dy$x))
 

Сюжет

Затем plot одну плотность и используйте lines для добавления остальных.

 plot(dx, col=4, ylim=c(-.25, .45), main='Density distributions', xlab='')
abline(h=0, lty=3, col=8)
lines(dy, col=3)
lines(dx$x, dd_xy, col=2, lty=2, lwd=2)  ## <---------------- difference
mtext(sprintf('N(x) = %s  Bandwidth(x) = %s', dx$n, signif(dx$bw, 3)), 1, 2)
mtext(sprintf('N(y) = %s  Bandwidth(y) = %s', dy$n, signif(dy$bw, 3)), 1, 3)
legend('topleft', legend=c('x', 'y', 'x - y'), col=4:2, 
       lty=c(1, 1, 2), lwd=c(1, 1, 2), title='density')
 

введите описание изображения здесь

Расчеты

 sapply(c('sum', 'mean', 'sd', 'min', 'max'), (x) do.call(x, list(dd_xy))) |>
  signif(3)
#       sum      mean        sd       min       max 
# -0.049700 -0.000097  0.088000 -0.249000  0.122000 
 

Данные:

 set.seed(42)
x <- rnorm(1000, 0, 2)
y <- rnorm(500, 1, 1)
 

Комментарии:

1. Спасибо за ответ. Я знаю, как построить два графика плотности на одном графике, но я хочу построить их разницу в виде графика и вычислить их разницу как уникальное значение. например: участок(плотность(df2)-плотность(df1))

2. @вахед Ага, пожалуйста, смотрите обновление. Обратите внимание, что для простоты я распаковал x и y из их фреймов данных.

3. Спасибо, Джей.сф. Отлично!. Это оно. Он делает то, что мне нужно.