此问题之前已被问过,但解决方案只能部分解决我的问题,而且我已经在这几天工作了。我觉得是时候寻求帮助了,即使这个话题已经解决过了。对于给您带来的任何不便,我们深表歉意。
我在R中有一个非常大的data.frame,有6288个11个变量的观测值。我想在每个变量上按组运行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
和Treatmen
来对NA
进行夏皮罗测试,所以我要测试1High,1Low,2High,2Low等等。我想拥有 W 统计数据和P值的数据。原始数据集包含每组16个观察值(1High,1Low等;总组数= 400),偶尔res<-aggregate(cbind(P.value=data$FW)~data$Number+data$Treatment,data,FUN=shapiro.test)
;此样本数据集包含每组6个观察值(1High,1Low,2High,2Low; groups = 4)。
以下代码之前已作为解决方案解决了群组的shapiro测试问题:
Warning message:
In format.data.frame(x, digits = digits, na.encode = FALSE) :
corrupt data frame: columns will be truncated or padded with NAs
我还尝试了其他一些分组方法,但似乎没有任何效果。上面的代码最接近。
上面的代码使用聚合对我的数据进行了适当的分组,并给了我W统计量,但它不会给我P值(列标题说“P.value”,但这不是P值,它是W统计数据,我已经通过几种方式证实了这一点。它还给了我以下警告信息:
data.frame
当我在谷歌搜索此警告时,结果表明它是import os
import sys
import subprocess
orig_stdout = sys.stdout
f = file('out.txt', 'w')
sys.stdout = f
os.system("date") #First command
cmd = ["ls", "-al"]
exe_cmd = subprocess.Popen(cmd, stdout=subprocess.PIPE)
output, err = exe_cmd.communicate()
print output #Second command
sys.stdout = orig_stdout
中的错误,但我无法弄清楚如何解决它。在这种情况下,我甚至不确定它确实是一个错误。
任何人都可以通过提供有关警告信息的一些见解或其他方式来按组进行夏皮罗测试吗?
答案 0 :(得分:3)
您收到该错误是因为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
答案 1 :(得分:0)
dplyr
包对于分组操作非常方便:
library(dplyr)
data %>%
group_by(Number, Treatment) %>%
summarise(statistic = shapiro.test(FW)$statistic,
p.value = shapiro.test(FW)$p.value)
Number Treatment statistic 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