R:Shapiro测试,由组别赢得';t产生p值和损坏的数据帧警告
以前有人问过这个问题,但提出的解决方案只能部分解决我的问题,我已经为此工作了好几天了。我觉得现在是寻求帮助的时候了,即使这个话题以前已经讨论过了。给您带来的不便,我深表歉意 我在R中有一个非常大的data.frame,有6288个11个变量的观测值。我想对每个变量按组运行Shapiro测试,但按两个不同的因素(数量和治疗)分组。提供了具有一个变量的大大减少的样本数据集,例如: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
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