Reputation: 89
I'm trying to obtain the compact letters associated with the p values I generated with the function pairwise.wilcox.test(). I used the function multcompLetters() which works well, but I want the letters to be ordered so that the highest mean gets the letter "a". In the following example, while using the function multcompLetters() to get the letters ordered, I receive the warning : "Error in tapply(data[, fm[[1]]], data[, fm[[2]]], function(x) do.call(mean, : arguments must have same length".
Is there something I don't understand with the usage of the function ?
Thanks a lot.
Adding data frame
As15 <- structure(list(Community = c("Arviat", "Arviat", "Arviat", "Arviat",
"Arviat", "Arviat", "Arviat", "Arviat", "Arviat", "Arviat", "Arviat",
"Arviat", "Arviat", "Arviat", "Arviat", "Arviat", "Arviat", "Arviat",
"Arviat", "Arviat", "Arviat", "Arviat", "Arviat", "Arviat", "Arviat",
"Arviat", "Arviat", "Arviat", "Arviat", "Arviat", "Arviat", "Arviat",
"Arviat", "Arviat", "Arviat", "Arviat", "Arviat", "Arviat", "Arviat",
"Arviat", "Arviat", "Arviat", "Arviat", "Arviat", "Arviat", "Arviat",
"Arviat", "Arviat", "Arviat", "Arviat", "Arviat", "Arviat", "Arviat",
"Arviat", "Arviat", "Arviat", "Arviat", "Arviat", "Arviat", "Arviat",
"Arviat", "Arviat", "Arviat", "Arviat", "Arviat", "Arviat", "Arviat",
"Arviat", "Arviat", "Arviat", "Arviat", "Arviat", "Arviat", "Arviat",
"Arviat", "Arviat", "Arviat", "Arviat", "Arviat", "Arviat", "Arviat",
"Arviat", "Arviat", "Arviat", "Nain", "Nain", "Nain", "Nain",
"Nain", "Nain", "Nain", "Nain", "Nain", "Nain", "Nain", "Nain",
"Nain", "Nain", "Nain", "Nain", "Nain", "Nain", "Nain", "Nain",
"Nain", "Nain", "Nain", "Nain", "Nain", "Nain", "Nain", "Nain",
"Nain", "Nain", "Nain", "Nain", "Nain", "Nain", "Nain", "Nain",
"Nain", "Nain", "Nain", "Nain", "Resolute", "Resolute", "Resolute",
"Resolute", "Resolute", "Resolute", "Resolute", "Resolute", "Resolute",
"Resolute", "Resolute", "Resolute", "Resolute", "Resolute", "Resolute",
"Resolute", "Resolute", "Resolute", "Resolute", "Resolute", "Resolute",
"Resolute", "Resolute", "Resolute", "Resolute", "Resolute", "Resolute",
"Resolute", "Resolute", "Resolute", "Resolute", "Resolute", "Resolute",
"Resolute", "Resolute", "Resolute", "Resolute", "Resolute", "Resolute",
"Resolute", "Resolute", "Resolute", "Resolute", "Resolute", "Resolute",
"Resolute", "Resolute", "Resolute", "Resolute", "Resolute", "Resolute",
"Resolute", "Resolute", "Resolute", "Resolute", "Resolute", "Resolute",
"Resolute", "Resolute", "Resolute", "Resolute", "Resolute", "Resolute",
"Resolute", "Resolute", "Resolute", "Resolute", "Resolute", "Resolute",
"Resolute", "Resolute", "Resolute", "Resolute", "Resolute", "Resolute",
"Resolute", "Resolute", "Resolute", "SachsHarbour", "SachsHarbour",
"SachsHarbour", "SachsHarbour", "SachsHarbour", "SachsHarbour",
"SachsHarbour", "SachsHarbour", "SachsHarbour", "SachsHarbour",
"SachsHarbour", "SachsHarbour", "SachsHarbour", "SachsHarbour",
"SachsHarbour", "SachsHarbour", "SachsHarbour", "SachsHarbour",
"SachsHarbour", "SachsHarbour", "SachsHarbour", "SachsHarbour",
"SachsHarbour", "SachsHarbour", "SachsHarbour", "SachsHarbour",
"SachsHarbour", "SachsHarbour", "SachsHarbour", "SachsHarbour",
"SachsHarbour", "SachsHarbour", "SachsHarbour", "SachsHarbour",
"SachsHarbour", "SachsHarbour", "SachsHarbour", "SachsHarbour",
"SachsHarbour", "SachsHarbour", "SachsHarbour", "SachsHarbour",
"SachsHarbour", "SachsHarbour", "SachsHarbour", "SachsHarbour",
"SachsHarbour", "SachsHarbour", "SachsHarbour", "SachsHarbour",
"SachsHarbour", "SachsHarbour", "SachsHarbour", "SachsHarbour",
"SachsHarbour", "SachsHarbour", "SachsHarbour", "SachsHarbour",
"SachsHarbour", "SachsHarbour", "SachsHarbour"), ArsenicD = c(0.0254,
0.121, 0.0726, 0.021, 0.0782, 0.0538, 0.1078, 0.0454, 0.0368,
0.0618, 0.037, 0.0754, 0.1394, 0.0784, 0.218, 0.1482, 0.0778,
0.0592, 0.0314, 0.0232, 0.0548, 0.0662, 0.0604, 0.0252, 0.0502,
0.0768, 0.036, 0.054, 0.0404, 0.0642, 0.0384, 0.0504, 0.0616,
0.068, 0.0678, 0.06, 0.0526, 0.0454, 0.0574, 0.0462, 0.0558,
0.0506, 0.0764, 0.0466, 0.0518, 0.0544, 0.0362, 0.0472, 0.0374,
0.0564, 0.0512, 0.0442, 0.0526, 0.05, 0.047, 0.0456, 0.073, 0.0798,
0.0544, 0.072, 0.0392, 0.0658, 0.1662, 0.036, 0.0562, 0.0584,
0.0416, 0.037, 0.046, 0.0334, 0.0384, 0.0654, 0.0528, 0.0274,
0.0368, 0.0634, 0.0308, 0.0702, 0.0502, 0.058, 0.037, 0.0456,
0.0404, 0.0516, 0.051, 0.0484, 0.054, 0.0344, 0.064, 0.0548,
0.032, 0.0532, 0.0562, 0.0464, 0.0334, 0.068, 0.0422, 0.298,
0.0344, 0.0338, 0.0508, 0.0356, 0.0446, 0.0484, 0.0408, 0.0148,
0.0374, 0.0244, 0.0644, 0.0574, 0.028, 0.0462, 0.067, 0.0472,
0.053, 0.0418, 0.0324, 0.054, 0.04, 0.0506, 0.0592, 0.0356, 0.049,
0.054, 0.296, 0.276, 0.226, 0.0834, 0.452, 0.306, 0.218, 0.33,
0.208, 0.1628, 0.426, 0.376, 0.0894, 0.438, 0.334, 0.212, 0.1606,
0.082, 0.1178, 0.1128, 0.142, 0.103, 0.0862, 0.1104, 0.0746,
0.0954, 0.202, 0.1362, 0.24, 0.21, 0.172, 0.278, 0.1354, 0.274,
0.228, 0.0854, 0.0924, 0.0992, 0.0648, 0.0548, 0.0768, 0.0996,
0.1008, 0.063, 0.0372, 0.1582, 0.228, 0.1514, 0.218, 0.1612,
0.1608, 0.1652, 0.1474, 0.1904, 0.0396, 0.1396, 0.0816, 0.1132,
0.0968, 1.258, 0.326, 0.236, 0.0854, 0.256, 0.1258, 0.1324, 0.1716,
0.1642, 0.22, 0.0836, 0.18, 0.274, 0.1918, 0.171, 0.356, 0.298,
0.1084, 0.1436, 0.238, 0.348, 0.1496, 0.342, 0.434, 0.146, 0.174,
0.288, 0.396, 0.1834, 0.64, 0.342, 0.686, 0.43, 0.1808, 0.454,
0.482, 0.352, 0.476, 0.422, 0.286, 0.81, 0.656, 0.564, 0.119,
0.296, 0.1778, 0.512, 0.278, 0.22, 0.208, 0.1474, 0.55, 0.1526,
0.1858, 0.128, 0.224, 0.1752, 0.0724, 0.1302, 0.1724, 0.1354,
0.104, 0.1132, 0.292, 0.238, 0.348, 0.1626, 0.312, 0.238, 0.236,
0.1276, 0.1228, 0.0978, 0.376, 0.1968, 0.1164, 0.448, 0.2, 0.1322,
0.117)), row.names = c(NA, -263L), class = c("tbl_df", "tbl",
"data.frame"))
Wilcoxon Test
As15Wilcox <- suppressWarnings(pairwise.wilcox.test(As15$ArsenicD, As15$Community, p.adjust.method = "BH"))
As15pvals <- c(na.omit(setNames(c(As15Wilcox$p.value),
do.call("paste", c(as.list(expand.grid(rownames(As15Wilcox$p.value),
colnames(As15Wilcox$p.value))), sep = "-")))))
Obtaining Letters
multcompLetters2(ArsenicD ~ Community, As15pvals, As15)
I verified with length(), and both ArsenicD and Community possess the same length.
Upvotes: 0
Views: 217
Reputation: 173793
It's not clear why you think you can pass the output of pairwise.wilcox.test
to the second argument of multcompLetters2
(the parameter x
). According to the docs:
x
- One of the following: (1) A square, symmetric matrix with row names. (2) A vector with hyphenated names, which identify individual items or factor levels after "strsplit". (3) An object of class "dist". If x (or x[1]) is not already of class "logical", it is replaced with do.call(compare, list(x, threshold)), which by default converts numbers (typically p-values) less than 0.05 to TRUE and everything else to FALSE. If x is a matrix, its diagonal must be or must convert to FALSE.
...whereas wilcox1
is an object of class "pairwise.htest"
.
However, it does contain a matrix of p values of the comparisons, which we can convert into one of the above formats. Let's demonstrate with a dataset similar to yours.
library(multcompView)
wilcox1 <- suppressWarnings(
pairwise.wilcox.test(site21$ArsenicD, site21$Community,
p.adjust.method = "BH"))
Using your code, we get an error:
multcompLetters2(ArsenicD ~ Community, wilcox1, site21)
#> Error in vec2mat2(namx, sep): Names must contain exactly one '-' each;
#> instead got method, data.name, p.value, p.adjust.method
Let us take the p values from our wilcox1
object and convert to a named vector with the correct pair names:
pvals <- c(na.omit(setNames(c(wilcox1$p.value),
do.call("paste", c(as.list(expand.grid(rownames(wilcox1$p.value),
colnames(wilcox1$p.value))), sep = "-")))))
pvals
#> North-East South-East West-East South-North West-North West-South
#> 4.746437e-14 1.077333e-04 3.164291e-14 3.164291e-14 3.164291e-14 7.175058e-08
And now we can do:
multcompLetters2(ArsenicD ~ Community, pvals, site21)
#> West South East North
#> "a" "b" "c" "d"
Data used
Obviously, we don't have your data, so here is a reproducible example with the same names and basic structure that I used for this example:
set.seed(1)
site21 <- data.frame(Community = rep(c("North", "East",
"South", "West"), each = 25),
ArsenicD = c(rnorm(25, 5), rnorm(25, 8),
rnorm(25, 9), rnorm(25, 11)))
Created on 2023-07-26 with reprex v2.0.2
Upvotes: 1