使用带有NA-continaing数据的ggpairs

时间:2012-10-26 20:26:05

标签: r ggplot2

ggpairs包中的

GGally似乎非常有用,但当数据集中的任何位置出现NA时,它似乎失败了:

#require(GGally)
data(tips, package="reshape")
pm <- ggpairs(tips[,1:3]) #works just fine

#introduce NA
tips[1,1] <- NA
ggpairs(tips[,1:3])
> Error in if (lims[1] > lims[2]) { : missing value where TRUE/FALSE needed

我没有看到任何处理NA值的文档,而ggpairs(tips[,1:3], na.rm=TRUE)等解决方案(不出所料)不会更改错误消息。

我有一个数据集,其中10%的值可能是NA,随机分散在整个数据集中。因此na.omit(myDataSet)将删除大部分数据。有没有办法解决这个问题?

3 个答案:

答案 0 :(得分:3)

GGally的某些功能ggparcoord()支持missing=[exclude,mean,median,min10,random]参数处理NAs。但遗憾的是ggpairs()并非如此。

您可以做的是用您期望ggpair()自动为您做的数据的良好估计来替换NAs。有一些很好的解决方案,例如用row meanszerosmedian甚至closest point替换它们(注意最近一句话中的4个超链接!)。

答案 1 :(得分:1)

我会用自己可怕的解决方法来拍摄它,因为我认为这需要刺激。我同意OP,基于统计假设填充数据或选择的黑客是探索性分析的一个可怕的想法,我认为一旦你忘记它是如何工作的(我大约五天)并且需要调整它就会保证失败它用于别的东西。

声明

这是一种可怕的做事方式,我讨厌它。它是有用的,当你有一个系统的NA来源来自高维数据集的稀疏采样,这可能是OP所拥有的。

实施例

假设你有一些非常大的数据集的一小部分,使你的一些列稀疏地表示出来:

|  Sample (0:350)|  Channel(1:118)|  Trial(1:10)|     Voltage|Class  (1:2)|  Subject (1:3)|
|---------------:|---------------:|------------:|-----------:|:-----------|--------------:|
|               1|               1|            1|  0.17142245|1           |              1|
|               2|               2|            2|  0.27733185|2           |              2|
|               3|               1|            3|  0.33203066|1           |              3|
|               4|               2|            1|  0.09483775|2           |              1|
|               5|               1|            2|  0.79609409|1           |              2|
|               6|               2|            3|  0.85227987|2           |              3|
|               7|               1|            1|  0.52804960|1           |              1|
|               8|               2|            2|  0.50156096|2           |              2|
|               9|               1|            3|  0.30680522|1           |              3|
|              10|               2|            1|  0.11250801|2           |              1|

require(data.table) # needs the latest rForge version of data.table for dcast
sample.table <- data.table(Sample = seq_len(10), Channel = rep(1:2,length.out=10),
                           Trial = rep(1:3, length.out=10), Voltage = runif(10), 
                           Class = as.factor(rep(1:2,length.out=10)),
                           Subject = rep(1:3, length.out=10))

这个例子很简单,但假装列是从较大的子集中均匀采样的。

假设您希望在所有频道上将数据转换为宽格式,以便使用ggpairs进行绘图。现在,规范dcast返回宽格式将无效,使用id列或其他方式,因为列范围稀疏(并且从未完全)表示:

wide.table <- dcast.data.table(sample.table, Sample ~ Channel,
                                   value.var="Voltage",
                                   drop=TRUE)

> wide.table
        Sample         1          2
     1:      1 0.1714224         NA
     2:      2        NA 0.27733185
     3:      3 0.3320307         NA
     4:      4        NA 0.09483775
     5:      5 0.7960941         NA
     6:      6        NA 0.85227987
     7:      7 0.5280496         NA
     8:      8        NA 0.50156096
     9:      9 0.3068052         NA
    10:     10        NA 0.11250801

在这种情况下显而易见的是id列可以起作用,因为它是一个玩具示例(sample.table[,index:=seq_len(nrow(sample.table)/2)]),但是对于一个巨大的数据的小型统一样本,它基本上是不可能的。一系列id值,当应用于公式参数时,将穿过数据中的每个孔。这个kludge将起作用:

setkey(sample.table,Class)

我们最后需要这个,以确保订购是固定的。

chan.split <- split(sample.table,sample.table$Channel)

它会为您提供每个唯一频道的data.frames列表。

cut.fringes <- min(sapply(chan.split,function(x) nrow(x)))
chan.dt <- cbind(lapply(chan.split, function(x){
  x[1:cut.fringes,]$Voltage}))

必须有一种更好的方法来确保每个data.frame具有相同数量的行,但对于我的应用程序,我可以保证它们只有几行不同,所以我只是修剪多余的行。 / p>

chan.dt <- as.data.table(matrix(unlist(chan.dt),
                 ncol = length(unique(sample.table$Channel)), 
                 byrow=TRUE))

这会让你回到一个大的data.table,其中Channels为列。

chan.dt[,Class:=
         as.factor(rep(0:1,each=sampling.factor/2*nrow(original.table)/ncol(chan.dt))[1:cut.fringes])]

最后,我重新修改了我的分类变量。表格应按类别排序,以便匹配。假设您拥有包含所有数据的原始表格;还有其他方法可以做到。

ggpairs(data=chan.dt,
        columns=1:length(unique(sample.table$Channel)), colour="Class",axisLabels="show")

现在可以根据上述情节绘制。

答案 2 :(得分:1)

据我所知,ggpairs()无法解决这个问题。另外,你绝对不能填写假冒的&#39;数据。如果在这里建议是合适的,我建议使用不同的绘图方法。例如

 cor.data<- cor(data,use="pairwise.complete.obs") #data correlations ignoring pair-wise NA's
 chart.Correlation(cor.data) #library(PerformanceAnalytics)

或使用此处的代码http://hlplab.wordpress.com/2012/03/20/correlation-plot-matrices-using-the-ellipse-library/