【问题标题】:How can calculate and plot difference between two density plots with different length of data?如何计算和绘制具有不同数据长度的两个密度图之间的差异?
【发布时间】:2021-09-19 20:38:32
【问题描述】:

假设我有两个不同长度的数据集如下:

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

我想计算并绘制 df1 和 df2 的密度图的差异。我需要差异值来计算两个密度图之间差异的总和/平均值。

【问题讨论】:

    标签: r


    【解决方案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)
    

    【讨论】:

    • 感谢您的回复。我知道如何在一张图中绘制两个密度图,但我想将它们的差异绘制为图表并将它们的差异计算为唯一值。例如:绘图(密度(df2)-密度(df1))
    • @vahed 啊哈,请查看更新。请注意,为简单起见,我已将 x 和 y 从他们的数据框中拆箱。
    • 感谢 Jay.sf。伟大的!。而已。它可以满足我的需要。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-21
    • 1970-01-01
    相关资源
    最近更新 更多