R:Shapiro测试,由组别赢得';t产生p值和损坏的数据帧警告

R:Shapiro测试,由组别赢得';t产生p值和损坏的数据帧警告,r,R,以前有人问过这个问题,但提出的解决方案只能部分解决我的问题,我已经为此工作了好几天了。我觉得现在是寻求帮助的时候了,即使这个话题以前已经讨论过了。给您带来的不便,我深表歉意 我在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

以前有人问过这个问题,但提出的解决方案只能部分解决我的问题,我已经为此工作了好几天了。我觉得现在是寻求帮助的时候了,即使这个话题以前已经讨论过了。给您带来的不便,我深表歉意

我在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))
我也尝试过其他一些分组方式,但似乎没有任何效果。上面的代码最接近

上面使用聚合的代码对我的数据进行了适当的分组,并给了我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
当我在谷歌上搜索这个警告时,结果表明这是
data.frame
中的一个bug,但我不知道如何解决它。我甚至不确定在这种情况下它是否真的是一个bug


任何人都可以通过提供对警告消息的一些深入了解,或者通过另一种方式按组执行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

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

这很有效,谢谢你!我真的很感谢你的时间!也许你能更好地帮助我理解聚合是如何工作的?根据您的脚本,我有以下脚本来执行Levene的测试。我想比较由数字定义的组内以及高和低处理之间的差异。我想比较由数字定义的组内以及高和低处理之间的差异(1Highx1Low,2Highx2Low)。'聚合(公式=数据$FW~数据$Number,FUN=函数(x){y@anothernewbie:请注意,您没有在
FUN=function(x)中使用
x
。这就是为什么
aggregate
只为每个组提供相同的东西——它不处理不同的数据子集。我承认:我被难住了。
FUN=function(x)中的
x
是参数,但我必须向函数传递哪些参数,才能要求它仅将该函数应用于我使用
聚合指定的子集
?我找不到一个好的在线源来解释用户定义函数中的参数。您能推荐一个吗?这很有效!非常感谢您的时间,我非常感谢!你能给我解释一下%>%是做什么的吗?我找不到它。也许它能帮助我理解如何使用group_by应用LEVENET测试。你的解决方案在shapiro.test中非常有效,但我不能修改它作为LEVENET测试。谢谢你。
%>%
操作符本质上意味着“然后”,它来自magrittr软件包,但已并入dplyr。谷歌“dplyr管道”阅读更多内容。如果您希望您的子组为
Number=1
Number=2
数据%>%groupby(Number)%%>%总结(p.value=leventest(y=FW,group=Treatment)[1,3])
-由于管道的原因,您不需要为数据参数指定值。您可能需要阅读。这些都是很好的资源,谢谢@Sam Firke!dplyr vignette特别有用。通过与他们的说明进行一点咨询,我使LevenTest工作起来。您能告诉我
[1,3]是什么吗
在这种特定情况下是否执行?
levenest
返回一个2x3 data.frame。
summary
需要一个值;因为我假设您需要p值,
[1,3]
levenest
result data.frame中提取第一行第三列值,这是p值。这是基本的R语法。
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
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