之前曾有人问过这个问题,但是提出的解决方案只能部分解决我的问题,而且我已经为此工作了好几天。我觉得是时候寻求帮助了,即使以前已经解决了这个话题。若带来不便请谅解。
我在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))
我想通过
FW
和Number
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/