密度图与多个组(Density plots with multiple groups)

2019-07-31 02:44发布

我想产生类似的东西densityplot()lattice package ,使用ggplot2使用多个归集与后mice包。 这里是一个重复的例子:

require(mice)
dt <- nhanes
impute <- mice(dt, seed = 23109)
x11()
densityplot(impute)

主要生产:

我想有过一些输出更多的控制了(我也是用这个作为一个学习锻炼ggplot)。 所以,对于bmi变量,我尝试这样做:

bar <- NULL
for (i in 1:impute$m) {
    foo <- complete(impute,i)
    foo$imp <- rep(i,nrow(foo))
    foo$col <- rep("#000000",nrow(foo))
    bar <- rbind(bar,foo)
}

imp <-rep(0,nrow(impute$data))
col <- rep("#D55E00", nrow(impute$data))
bar <- rbind(bar,cbind(impute$data,imp,col))
bar$imp <- as.factor(bar$imp)

x11()
ggplot(bar, aes(x=bmi, group=imp, colour=col)) + geom_density()
+ scale_fill_manual(labels=c("Observed", "Imputed"))

这产生这样的:

因此,有几个问题是:

  1. 颜色是错误的。 看来我试图控制颜色是完全错误/忽略
  2. 有不必要的水平线和垂直线
  3. 我想图例显示估算的,并观察到,但我的代码提供了错误invalid argument to unary operator

此外,它似乎是相当多的工作做的是在一个符合完成的densityplot(impute) -所以我想,如果我可以在完全错误的方式去这件事?

编辑 :我要补充的第四个问题,由@ROLO指出:

0.4。 该地块的范围,似乎是不正确的。

Answer 1:

它之所以是比较复杂的使用GGPLOT2是您正在使用densityplot从小鼠封装( mice::densityplot.mids要精确-看看它的代码),而不是从自身格。 该功能拥有所有绘图功能的mids从结果类mice内置的。如果你想尝试使用相同的lattice::densityplot ,你会发现它是至少多的工作,使用GGPLOT2。

但事不宜迟,这里是如何与GGPLOT2做到这一点:

require(reshape2)
# Obtain the imputed data, together with the original data
imp <- complete(impute,"long", include=TRUE)
# Melt into long format
imp <- melt(imp, c(".imp",".id","age"))
# Add a variable for the plot legend
imp$Imputed<-ifelse(imp$".imp"==0,"Observed","Imputed")

# Plot. Be sure to use stat_density instead of geom_density in order
#  to prevent what you call "unwanted horizontal and vertical lines"
ggplot(imp, aes(x=value, group=.imp, colour=Imputed)) + 
    stat_density(geom = "path",position = "identity") +
    facet_wrap(~variable, ncol=2, scales="free")

但正如你所看到的这些地块的范围比那些来自小densityplot 。 这种行为应该由参数来控制trimstat_density ,但这似乎不工作。 固定的代码后stat_density我得到了以下情节:

还没完全一样的densityplot原始,但非常接近。

编辑:对于一个真正的修复,我们需要等待GGPLOT2的下一个主要版本,请参阅github上 。



Answer 2:

你可以问哈德利添加设防方法为这个中频类。 例如

fortify.mids <- function(x){
 imps <- do.call(rbind, lapply(seq_len(x$m), function(i){
   data.frame(complete(x, i), Imputation = i, Imputed = "Imputed")
 }))
 orig <- cbind(x$data, Imputation = NA, Imputed = "Observed")
 rbind(imps, orig)
}

ggplot“固本”非data.frame对象绘制之前

ggplot(fortify.mids(impute), aes(x = bmi, colour = Imputed, 
   group = Imputation)) +
geom_density() + 
scale_colour_manual(values = c(Imputed = "#000000", Observed = "#D55E00"))

注意,每一个“+”结束。 否则,命令有望完成。 这就是为什么传说并没有改变。 并开始与一个“+”行导致错误。

你可以融化fortify.mids的结果绘制在一个图中所有变量

library(reshape)
Molten <- melt(fortify.mids(impute), id.vars = c("Imputation", "Imputed"))
ggplot(Molten, aes(x = value, colour = Imputed, group = Imputation)) + 
geom_density() + 
scale_colour_manual(values = c(Imputed = "#000000", Observed = "#D55E00")) +
facet_wrap(~variable, scales = "free")



文章来源: Density plots with multiple groups