查找双变量中位数的数据和置信“椭圆”(区域?)?

机器算法验证 r 置信区间 中位数 双变量 椭圆
2022-03-19 04:10:16

我想知道围绕双变量中位数计算数据和置信椭圆的方法。例如,我可以轻松计算以下数据的二元均值的数据椭圆或置信椭圆(此处仅显示数据椭圆)

library("car")
set.seed(1)
df <- data.frame(x = rnorm(200, mean = 4, sd = 1.5),
                 y = rnorm(200, mean = 1.4, sd = 2.5))
plot(df)
with(df, dataEllipse(x, y, level = 0.68, add = TRUE))

在此处输入图像描述

但是我正在为如何为双变量中位数做这件事而苦苦挣扎?在单变量情况下,我可以引导重新采样以生成所需的间隔,但我不确定如何将其转换为双变量情况?

正如@Andy W 所指出的,中位数不是唯一定义的。在这种情况下,我们使用空间中位数,通过找到一个点,使该点的观测值之间的距离的 L1 范数最小化。优化用于从观察到的数据点计算空间中值。

此外,实际用例中的 x、y 数据对是相异矩阵的主坐标分析的两个特征向量,因此 x 和 y 应该是正交的,如果这提供了特定的攻击途径。

在实际用例中,我们想要计算欧几里得空间中点组的数据/置信椭圆。例如:

在此处输入图像描述

该分析是对组间方差同质性的 Levene 检验的多元模拟。我们使用空间中位数或标准组质心作为多元集中趋势的度量,并希望为空间中位数情况添加上图中数据椭圆的等价物。

1个回答

这是一个很好的问题。

我将遵循@amoeba 的建议depth::med()并使用with引导空间中位数method="Spatial"但是,有一点复杂:med当有重复的数据点时不喜欢它,所以我们不能做一个简单的引导。相反,我将绘制一个引导样本,然后将每个点抖动一小部分 - 小于每个点中的最小距离xy原始数据样本中的维度 - 在计算空间中位数之前。

最后,我将计算覆盖指定比例 (95%) 自举中位数和绘图的最小椭圆。

library(depth)      # for med()
library(MASS)           # for cov.rob()
library(cluster)    # for ellipsoidhull()

# create data
set.seed(1)
df <- data.frame(x = rnorm(200, mean = 4, sd = 1.5),
                 y = rnorm(200, mean = 1.4, sd = 2.5))

# find minimum distances in each dimension for later jittering
foo <- outer(X=df$x,Y=df$x,FUN=function(xx,yy)abs(xx-yy))
delta.x <- min(foo[upper.tri(foo)])/2
foo <- outer(X=df$y,Y=df$y,FUN=function(xx,yy)abs(xx-yy))
delta.y <- min(foo[upper.tri(foo)])/2

# bootstrap spatial medians, using jittering
n.boot <- 1000
pb <- winProgressBar(max=n.boot)
boot.med <- matrix(NA,nrow=n.boot,ncol=2)
for ( ii in 1:n.boot ) {
    setWinProgressBar(pb,ii,paste(ii,"of",n.boot))
    index <- sample(1:nrow(df),nrow(df),replace=TRUE)
    bar <- df[index,] + 
      data.frame(x=runif(nrow(df),-delta.x,delta.x),
                 y=runif(nrow(df),-delta.y,delta.y))
    boot.med[ii,] <- med(bar,method="Spatial")$median
}
close(pb)

# specify confidence level
pp <- 0.95

# find smallest ellipse containing the specified proportion of bootstrapped medians
fit <- cov.rob(boot.med, quantile.used = ceiling(pp*n.boot), method = "mve")
best_ellipse <- ellipsoidhull( boot.med[fit$best,] )

plot(df)
points(boot.med,pch=19,col="grey",cex=0.5)
points(df)
lines(predict(best_ellipse), col="red")
legend("bottomright",bg="white",pch=c(21,19,NA),
    col=c("black","grey","red"),pt.bg=c("white",NA,NA),lwd=c(0,0,1),
    legend=c("Observations","Bootstrapped medians","Confidence ellipse"))

置信椭圆

最后,注意二元空间中位数是渐近正态分布的(Brown, 1983, JRSS, Series B,所以我们也可以省去上面的“jittered bootstrap”,直接计算椭圆,相信n=200是“足够渐近的”。如果我在接下来的几天找到时间,我可能会编辑这篇文章以包含这个参数置信椭圆。