我注意到,使用rstat包中的统计测试fligner.test可以通过一个简单的转换得到不同的结果,尽管事实并非如此.

下面是一个例子(原始数据集的差异要大得多):

g  <- factor(rep(1:2, each=6))
x1 <- c(2,2,6,6,1,4,5,3,5,6,5,5)
x2 <- (x1-1)/5 #> cor(x1,x2) [1] 1
fligner.test(x1,g) # chi-squared = 4.2794, df = 1, p-value = 0.03858
fligner.test(x2,g) # chi-squared = 4.8148, df = 1, p-value = 0.02822

查看功能代码,我注意到median centering可能是导致问题的原因:

x1 <- x1 - tapply(x1,g,median)[g]
x2 <- x2 - tapply(x2,g,median)[g]
unique(abs(x1)) # 1 3 2 0
unique(abs(x2)) # 0.2 0.6 0.4 0.2 0.0 <- repeated 0.2

这是一个已知的问题吗?这种不一致应该如何解决?

推荐答案

我认为你的分析在这里是正确的.在您的示例中,问题最终出现是因为(0.8 - 0.6) == 0.2FALSE,除非四舍五入到小数点后15位.您应该提交错误报告,因为这是可以避免的.

如果你在此期间感到绝望,你可以通过在中位数居中阶段应用一点点舍入来消除浮点不等,从而适应stats:::fligner.test.default:

fligner <- function (x, g, ...) 
{
  if (is.list(x)) {
    if (length(x) < 2L) 
      stop("'x' must be a list with at least 2 elements")
    DNAME <- deparse1(substitute(x))
    x <- lapply(x, function(u) u <- u[complete.cases(u)])
    k <- length(x)
    l <- lengths(x)
    if (any(l == 0)) 
      stop("all groups must contain data")
    g <- factor(rep(1:k, l))
    x <- unlist(x)
  }
  else {
    if (length(x) != length(g)) 
      stop("'x' and 'g' must have the same length")
    DNAME <- paste(deparse1(substitute(x)), "and", 
                   deparse1(substitute(g)))
    OK <- complete.cases(x, g)
    x <- x[OK]
    g <- g[OK]
    g <- factor(g)
    k <- nlevels(g)
    if (k < 2) 
      stop("all observations are in the same group")
  }
  n <- length(x)
  if (n < 2) 
    stop("not enough observations")
  x <- round(x - tapply(x, g, median)[g], 15)
  a <- qnorm((1 + rank(abs(x))/(n + 1))/2)
  a <- a - mean(a)
  v <- sum(a^2)/(n - 1)
  a <- split(a, g)
  STATISTIC <- sum(lengths(a) * vapply(a, mean, 0)^2)/v
  PARAMETER <- k - 1
  PVAL <- pchisq(STATISTIC, PARAMETER, lower.tail = FALSE)
  names(STATISTIC) <- "Fligner-Killeen:med chi-squared"
  names(PARAMETER) <- "df"
  METHOD <- "Fligner-Killeen test of homogeneity of variances"
  RVAL <- list(statistic = STATISTIC, parameter = PARAMETER, 
               p.value = PVAL, method = METHOD, data.name = DNAME)
  class(RVAL) <- "htest"
  return(RVAL)
}

现在,这将为两个向量返回正确的结果:

fligner(x1,g)
#> 
#> Fligner-Killeen test of homogeneity of variances
#> 
#> data:  x1 and g
#> Fligner-Killeen:med chi-squared = 4.2794, df = 1, p-value = 0.03858

fligner(x2,g) 
#> 
#> Fligner-Killeen test of homogeneity of variances
#> 
#> data:  x2 and g
#> Fligner-Killeen:med chi-squared = 4.2794, df = 1, p-value = 0.03858

R相关问答推荐

从字符载体创建函数参数

是否有任何解决方案可以优化VSCode中RScript的图形绘制?

为什么以及如何修复Mapview不显示所有点并且st_buffer合并一些区域R?

在数据表中呈现数学符号

提取R中值和列名的所有可能组合

ggplot geom_smooth()用于线性回归虚拟变量-没有回归线

为什么st_join(ob1,ob2,left = True)返回具有比ob1更多功能的sf对象?

如何使用`ggplot2::geom_segment()`或`ggspatial::geom_spatial_segment()`来处理不在格林威治中心的sf对象?

ggplot2中的X轴显示数值,单位为百,而不是十

条形图和在Ploly中悬停的问题

在rpart. plot或fancyRpartPlot中使用带有下标的希腊字母作为标签?

如何将R中数据帧中的任何Nas替换为最后4个值

从多层嵌套列表构建Tibble?

在纵向数据集中创建新行

R -基线图-图形周围的阴影区域

如何为混合模型输出绘制不同的线型?

ArrangeGrob()和类似的替代方法不接受Grob列表.在Grid.Draw,返回:glist中的错误(...):仅允许在glist";中使用Grobs;

ggplot斜体轴刻度标签中的单个字符-以前的帖子建议不工作

在shiny 表格中输入的文本在第一次后未更新

通过匹配另一个表(查找表)中的列值来填充数据表,并在另一个变量上进行内插