r - sm.密度.compare() : displaying multiple density estimations in a single plot

标签 r density-plot

我试图在 R 中叠加三个不同的密度图,以创建一个显示所有三条线的图(叠加)。我已经安装/加载了 sm 软件包,但我尝试将它与我的数据一起使用,但没有成功。 我简单地使用密度()创建了三个单独的数据图并绘制了值。我的代码如下所示:

library(sm)

set.seed(0)
x <- rnorm(100, 0, 1)
y <- rnorm(126, 0.3, 1.2)
z <- rnorm(93, -0.5, 0.7)
dx <- density(x)
dy <- density(y)
dz <- density(z)

plot(dx)
plot(dy)
plot(dz)

但是当我尝试使用 sm.densis.compare() 覆盖图表时:

sm.density.compare(dx,dy,model="equal")

我收到一条错误消息:

Error in sm.density.compare(dx, dy, model = "equal") :
sm.density.compare can handle only 1-d data trace:

有人知道我该如何解决这个问题吗?我已经研究了很多但没有成功。我对 R 还很陌生,确实需要帮助。

最佳答案

如果您想使用sm.densis.compare(),则不要使用densis()

sm.densis.compare() 本身正在进行密度估计。具体来说,它对分组数据进行密度估计,以便您可以在同一张图表上绘制不同组的密度。

这是您真正需要做的:

## three groups, each of length: length(x), length(y), length(z)
group.index <- rep(1:3, c(length(x), length(y), length(z)))
## collect data together and use sm.density.compare()
den <- sm.density.compare(c(x,y,z), group = group.index, model = "equal")
## plot will be generated automatically

den3

使用model = "equal"时,sm.密度.compare()已返回值。看看str(den):

List of 4
 $ p          : num 0
 $ estimaate  : num [1:3, 1:50] 2.37e-07 3.81e-06 6.06e-10 2.17e-06 2.26e-05 ...
 $ eval.points: num [1:50] -4.12 -3.94 -3.76 -3.58 -3.4 ...
 $ h          : num 0.376

h 包含用于所有密度估计的带宽,eval.points 包含估计点,而 estimaate 是密度估计值的矩阵。 (Adrian 这里有一个拼写错误,应该是“估计”,而不是“估计”,哈哈)。

sm 包中的所有函数,以前缀 sm. 开头,接受可选参数 ...,传递给 sm.options 。阅读一下?sm.options,您会发现您可以完全控制颜色显示、线型和线宽、带宽选择方法等。

引用带只会添加到两组数据中。即,对于成对比较,sm.densis.compare() 可以做更多事情。例如:

den2 <- sm.density.compare(c(x,y), group = rep(1:2, c(length(x), length(y))),
                           model = "equal")

den2

> str(den2)
List of 6
 $ p          : num 0.22
 $ estimate   : num [1:2, 1:50] 4.92e-06 2.70e-05 2.51e-05 1.00e-04 1.09e-04 ...
 $ eval.points: num [1:50] -4.12 -3.94 -3.76 -3.58 -3.4 ...
 $ upper      : num [1:50] 0.00328 0.00373 0.00459 0.00614 0.00886 ...
 $ lower      : num [1:50] 0 0 0 0 0 ...
 $ h          : num 0.44

其中lowerupper给出引用带/置信区域的界限。

<小时/>

如果您使用密度(),则不要使用sm.密度.compare()

## set universal estimation range
xlim <- range(x, y, z)
dx <- density(x, from = xlim[1], to = xlim[2], n = 200)
dy <- density(y, from = xlim[1], to = xlim[2], n = 200)
dz <- density(z, from = xlim[1], to = xlim[2], n = 200)

在这种情况下,每个组的密度估计是独立完成的。每个“密度”对象都是一个列表,例如:

> str(dx)
List of 7
 $ x        : num [1:200] -2.64 -2.61 -2.58 -2.55 -2.52 ...
 $ y        : num [1:200] 0.023 0.026 0.0291 0.0323 0.0356 ...
 $ bw       : num 0.31
 $ n        : int 100
 $ call     : language density.default(x = x, n = 200, from = xlim[1], to = xlim[2])
 $ data.name: chr "x"
 $ has.na   : logi FALSE
 - attr(*, "class")= chr "density"

x 是评估点,y 是估计密度,bw 是使用的带宽。您会看到,由于独立估计,dx$bwdy$bwdz$bw 是不同的。但是,您可以在调用密度() 时使用参数bw 手动指定通用bw。请参阅?密度,这里不再举例。

现在,要覆盖这些密度图,您需要自己动手。

## set global plotting range
ylim <- range(dx$y, dy$y, dz$y)
## make plot
plot(dx$x, dx$y, col = 1, lwd = 2, type = "l", xlim = xlim, ylim = ylim)
lines(dy$x, dy$y, col = 2, lwd = 2)
lines(dz$x, dz$y, col = 3, lwd = 2)

do it yourself

关于r - sm.密度.compare() : displaying multiple density estimations in a single plot,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37976140/

相关文章:

r - geom_密度()图中的多个组

r - 跨密度图 X 轴的意外线 (r)

r - na.action = na.exclude 在 lme4 1.0-5 中使用 lmer 的行为与 lm 和旧版本的 lme4 不一致

r - 如何在 R Shiny 中添加更大的文本输入框?

r - 按组和变量名称缩放 R 数据框中的值

r - R 中离散数据的计算密度

python - x,y 点数组的密度图

r - 在 R 中将熔化数据帧转换为矩阵

r - 在每组/ggplot2 等价的类型 ="o"的线前绘制点

r - 使用 R 进行 2D 投影的 3D 表面