之前曾有人问过这个问题,但是提出的解决方案只能部分解决我的问题,而且我已经为此工作了好几天。我觉得是时候寻求帮助了,即使以前已经解决了这个话题。若带来不便请谅解。

我在R中有一个非常大的data.frame,其中包含11个变量的6288个观测值。我想按组对每个变量进行一次Shapiro测试,但要按两个不同的因素(数量和治疗)进行分组。例如,提供了一个带有一个变量的精简样本数据集:

data <- data.frame(Number=c(1,1,1,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2,2,2),
                   Treatment=c("High","High","High","High","High","High","Low",
                               "Low","Low","Low","Low","Low","High","High","High",
                               "High","High","High","Low","Low","Low","Low","Low",
                               "Low"),
                   FW=c(746,500,498,728,626,580,1462,738,1046,568,320,578,654,664,
                        660,596,1110,834,486,548,688,776,510,788))


我想通过FWNumber t在Treatmen上运行Shapiro测试,因此我要对1High,1Low,2High,2Low等进行测试。我想同时获得这两个数据W统计量和P值。原始数据集每组包含16个观察值(1高,1低等;总组= 400),偶尔还有NA;此样本数据集每组包含6个观察值(1高,1低,2高,2低;组= 4)。

以前发布了以下代码,以解决按组进行的shapiro测试问题:

res<-aggregate(cbind(P.value=data$FW)~data$Number+data$Treatment,data,FUN=shapiro.test)


我还尝试了多种其他分组方式,但是似乎没有任何效果。上面的代码最接近。

上面使用聚合的代码将我的数据适当地分组,并为我提供了W统计信息,但它不会为我提供P值(列标题为“ P.value”,但这不是P值,而是W统计信息) ,我已经通过几种方法确认了)。它还给了我以下警告信息:

Warning message:
In format.data.frame(x, digits = digits, na.encode = FALSE) :
  corrupt data frame: columns will be truncated or padded with NAs


当我在Google搜索此警告时,结果表明这是data.frame中的错误,但我不知道如何解决。在这种情况下,我什至不确定这确实是一个错误。

任何人都可以通过提供一些对警告消息的了解来提供帮助,或者通过其他方式进行小组的Shapiro测试吗?

最佳答案

之所以会出现此错误,是因为shapiro.test返回一个列表,并且aggregate希望聚合的结果是矢量或单个数字。

aggregate查看列表,默认情况下采用列表的第一个元素,并告诉您为什么不满意(用模糊的术语表示)。但是它仍然为您提供Shapiro-Wilk统计信息,因为这是从shapiro.test返回的列表的第一个元素。

您可以对现有代码进行一些修改,从而毫无问题地获得所需的内容:

aggregate(formula = FW ~ Number + Treatment,
          data = data,
          FUN = function(x) {y <- shapiro.test(x); c(y$statistic, y$p.value)})

#   Number Treatment       FW.W      FW.V2
# 1      1      High 0.88995051 0.31792857
# 2      2      High 0.78604502 0.04385663
# 3      1       Low 0.93305840 0.60391888
# 4      2       Low 0.86456934 0.20540230


请注意,最右边的列对应于统计量和p值。

这是直接从列表中提取统计信息和p值,从而使聚合结果成为单个向量,这使aggregate感到满意。



另一种选择是使用CRAN提供的data.table package

library(data.table)

DT <- data.table(data)

DT[,
   .(W = shapiro.test(FW)$statistic, P.value = shapiro.test(FW)$p.value),
   by = .(Number, Treatment)]

#    Number Treatment         W    P.value
# 1:      1      High 0.8899505 0.31792857
# 2:      1       Low 0.9330584 0.60391888
# 3:      2      High 0.7860450 0.04385663
# 4:      2       Low 0.8645693 0.20540230

关于r - R:按组进行Shapiro测试不会产生p值和损坏的数据框警告,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/30201113/

10-12 17:22