从格子中删除异常值(splom)

时间:2013-04-16 09:44:28

标签: r lattice outliers

我想将一些数据绘制为带有点阵的散点图矩阵。但是,数据包含一些异常值。这导致主要数据的非常紧凑的情节。我想从图中删除异常值。观察可以是一个测量变量的异常值,但不是另一个测量变量的异常值,因此对于矩阵内的每个单个散点图,需要计算要去除的异常值。由于异常值构成了大约10,000个中的最大10个观测值,因此我想要简单地删除每个变量的最低值的10个观测值(异常值通常是更负方向的值)。我知道我必须修改面板功能,但我仍然坚持如何做到这一点。另外,我的下面板是一个hexbinplot,所以它也应该修改,我希望这将以相同的方式工作。有没有人有想法?

MWE:

require(lattice)
require(hexbin)
data(iris)

iris.out <- iris
iris.out[2,1] <- 1
iris.out[3,1] <- .2
iris.out[4,2] <- .1
iris.out[5,2] <- .2

splom(~iris.out[1:4], groups = Species, data = iris,
  lower.panel = function(...,groups){
    panel.hexbinplot(xbins = 20,
                     colramp = function(n){heat.ob(n, beg=15, end=225)},...,groups=NULL)
  },
  diag.panel = function(x,...){
    yrng <- current.panel.limits()$ylim
    d <- density(x, na.rm = TRUE)
    d$y <- with(d, yrng[1] + 0.95 * diff(yrng) * y / max(y))
    panel.lines(d, col = "darkgrey")
    diag.panel.splom(x, ...)
  }

1 个答案:

答案 0 :(得分:1)

我也许有一个部分解决方案。对于双变量图,我在x和y中删除了由最低10个观测值定义的异常值。此外,'groups'因子仅在上面板中实现。

splom(~iris.out[1:4],
  lower.panel=function(x,y,...){
    x.out=order(x,decreasing=FALSE)[1:10]
    y.out=order(x,decreasing=FALSE)[1:10]
    out=c(x.out,y.out)
    x=x[-out]
    y=y[-out]
    panel.hexbinplot(x,y, xbins =20,colramp = function(n){heat.ob(n, beg=15, end=225)},...)
  },
  diag.panel = function(x,...){
    x=x[-order(x,decreasing=FALSE)[1:10]]
    yrng <- current.panel.limits()$ylim
    d <- density(x, na.rm = TRUE)
    d$y <- with(d, yrng[1] + 0.95 * diff(yrng) * y / max(y))
    panel.lines(d, col = "darkgrey")
    diag.panel.splom(x, ...)
  },
  upper.panel=function(x,y,groups=iris$Species,...){
    x.out=order(x,decreasing=FALSE)[1:10]
    y.out=order(x,decreasing=FALSE)[1:10]
    out=c(x.out,y.out)
    x=x[-out]
    y=y[-out]
    panel.splom(x,y,groups=iris$Species,...)
  }
)