<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />Si vous exécutez un test similaire à celui de Tukey, JMP génère un "rapport de lettres de connexion". Cependant, nos données ne sont pas normales et les variances sont hétérogènes. Nous avons donc dû utiliser le test de Kruskal-Wallis pour examiner la variance, puis utiliser Steel-Dwass pour comparer les moyennes de toutes les paires de traitements. Comment pouvons-nous obtenir un rapport de lettres similaires après avoir fait cette analyse ?
Merci,
Zack
J'ai pu utiliser la bibliothèque readxl pour lire directement l'entrée xls
bibliothèque("readxl")
Le fichier Excel d'entrée doit être configuré comme ceci, avec deux colonnes. Où A,B sont les colonnes et 1,2,3 sont les lignes
UN B
comparaison par paires p.value
1 juin-août 0,1637
2 nov.-août 0,1093
3 nov-juillet 0,9316
Pouvez-vous (ou quelqu'un d'autre) publier un exemple complet d'un petit fichier d'entrée, le code et la sortie du processus ci-dessus pour effectuer le les lettres compactes s'affichent après une analyse non paramétrique avec des comparaisons par paires post-hoc à partir d'un fichier Excel ou d'entrée de texte.
J'ai pensé mettre à jour ce message car j'ai trouvé un moyen de produire un affichage compact des lettres après une analyse non paramétrique avec des comparaisons par paires post-hoc.
REMARQUE : Cela nécessite le programme statistique open source et facilement disponible R (j'ai utilisé RStudio, une version plus conviviale).
Après avoir effectué votre analyse non paramétrique dans JMP, exportez le tableau des résultats avec les valeurs p par paires dans une feuille Excel. Vous devez ensuite formater le champ de la comparaison afin qu'il se trouve dans une seule cellule, avec un seul '-' séparant les variables comparées.
Ensuite, dans R, créez une fonction en utilisant ce script à partir de https://rdrr.io/github/GegznaV/spMisc/src/R/eval_glue.R ::
#' [!] Format, parse and evaluate expression in a string
#'
#' A wrapper function to format and parse a string and evaluate it
#' as an expression. \code{eval_(X)} is a wrapper for
#' \code{eval(parse(text = glue::glue(X)))}.
#'
#' @details
#' It's a good practice to write backticks (`) arround variable names
#' to prevent from errors in situations, where variables have uncommon
#' names. See examples.
#'
#' @param ... Strings to be formatted and evaluated as an expression.
#' @param .open [\code{character(1)}: ‘\{’] \cr
#' The opening delimiter. Doubling the full delimiter escapes it.
#' @param .close [\code{character(1)}: ‘\}’] \cr
#' The closing delimiter. Doubling the full delimiter escapes it.
#' @inheritParams glue::glue
#' @inheritParams base::eval
#'
#' @export
#' @seealso Format and interpolate a string (\code{\link[glue]{glue}}).\cr
#' Evaluate an (unevaluated) expression (\code{\link[base]{eval}}).\cr
#' Parse expressions (\code{\link[base]{parse}}).
#' @examples
#' library("spMisc")
#'
#' AA <- "nn"
#'
#' glue::glue("{AA} <- 3")
#'
#' eval_glue("{AA} <- 3")
#'
#' AA
#'
#' nn
#'
#' # It's a good practice to write backticks (`) arround variable names
#' # to prevent from errors in situations, where variables have uncommon
#' # names:
#'
#' BB <- "A B"
#'
#' eval_glue("`{BB}` <- 8")
#'
#' `A B`
#'
eval_glue <- function(..., envir = parent.frame(),
.sep = "", .open = "{", .close = "}") {
x2 <- glue::glue(..., .envir = envir, .open = .open, .close = .close)
eval(parse(text = x2), envir = envir)
}
Ensuite, créez une autre fonction à partir de ce script à partir de https://github.com/GegznaV/biostat/blob/master/R/make_cld_df.R ::
#' **[!!]** Make a data frame with cld
#'
#' Compute a compact letter display (cld) of statistically significant
#' differences in pairwise comparisons and output he results as a dataframe.
#'
#' @note
#' This function is based on code in function [rcompanion::cldList()]
#' from package \pkg{rcompanion} by Salvatore Mangiafico.
#'
#' @param swap_compared_names (logical) \cr If `TRUE`, group names are swapped
#' from, e.g., "2-1" or "second-first" to "1-2" or "first-second". This leads to
#' different order of cld letters and different order of compared groups (if
#' without swapping the result is incorrect order of groups.)
#'
#' @inheritParams rcompanion::cldList
#' @inheritParams multcompView::multcompLetters
#'
#' @export
#' @keywords internal
# @param comparison_order (character) Character vector with desired order of groups.
make_cld_df <- function(
formula = NULL,
data = NULL,
comparison = NULL,
p.value = NULL,
threshold = 0.05,
print.comp = FALSE,
remove.space = TRUE,
remove.equal = TRUE,
# remove.zero = TRUE,
swap.colon = TRUE,
swap.vs = FALSE,
reversed = FALSE,
swap_compared_names = FALSE,
# comparison_order = NULL,
...) {
if (!is.null(formula)) {
# # **[!!!]** Formula interface needs review.
# p.value = eval(parse(text = paste0("data", "$", all.vars(formula[[2]])[1])))
# comparison = eval(parse(text = paste0("data", "$", all.vars(formula[[3]])[1])))
p.value <- eval_glue("data${all.vars(formula[[2]])[1]}")
comparison <- eval_glue("data${all.vars(formula[[3]])[1]}")
}
significant_difference <- p.value < threshold
# if (sum(significant_difference) == 0) {
# stop("No significant differences.", call. = FALSE)
# }
if (remove.space == TRUE) {
comparison <- gsub(" ", "", comparison)
}
if (remove.equal == TRUE) {
comparison <- gsub("=", "", comparison)
}
# if (remove.zero == TRUE) {
# comparison = gsub("0", "", comparison)
# }
if (swap.colon == TRUE) {
comparison <- gsub(":", "-", comparison)
}
if (swap.vs == TRUE) {
comparison <- gsub("vs", "-", comparison)
}
if (swap_compared_names == TRUE) {
part_1 <- stringr::str_extract(comparison, ".*(?=-)")
part_2 <- stringr::str_extract(comparison, "(?<=-).*")
comparison <- paste0(part_2, "-", part_1)
}
comparison
names(significant_difference) <- comparison
if (print.comp == TRUE) {
Y <- data.frame(Comparisons = names(significant_difference))
cat("\n\n")
print(Y)
cat("\n\n")
}
MCL <- multcompView::multcompLetters(significant_difference, reversed = reversed)
regular_cld <- as.character(MCL$Letters)
spaced_cld <- as.character(MCL$monospacedLetters)
if (is.null(MCL$monospacedLetters)) {
spaced_cld <- regular_cld
} else {
spaced_cld <- spaced_cld
}
res <- data.frame(
group = names(MCL$Letters),
cld = as.character(MCL$Letters),
spaced_cld = gsub(" ", "_", spaced_cld)
)
structure(res, class = c("cld_object", class(res)))
}
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# Helper function
# cld_update <- function(res) {
# res$MonoLetter <- gsub(" ", "_", res$MonoLetter)
# names(res) <- c("Group", "cld", "spaced_cld")
# structure(res, class = c("cld_object", class(res)))
# }
Vous pouvez ensuite appliquer la nouvelle fonction make_cld_df à vos données sous la forme : :
x<-make_cld_df(p.value~pairwisecomparison, data=data.
puis appelez x
Je vérifierais que la demande d'amélioration figure dans la liste de souhaits JMP, et si ce n'est pas le cas, je l'ajouterais à la liste
Quatre ans plus tard, souhaitant toujours avoir cette fonctionnalité.
Il semble qu'il n'y ait aucun moyen intégré au programme, et je ne suis pas doué pour le codage (d'où l'utilisation de JMP au lieu de SAS). J'imagine que SAS a plus d'options pour cela, mais je suis passé à JMP en raison de la facilité d'utilisation. En fonction de vos données, il peut être bon d'exécuter simplement une ANOVA et d'utiliser Tukey ou similaire si vous pouvez corriger la variance avec une transformation ou de vous fier à l'ANOVA de Welch si ce n'est pas le cas.
Il s'avère que l'hypothèse de normalité ne doit pas toujours être respectée :
Expériences en écologie, par AJ Sous-bois. 2006. La presse de l'Universite de Cambridge ( pages 192-193)
J'ai également cherché un moyen de le faire, je suis sûr que vous pourriez le scripter d'une manière ou d'une autre, mais que vous n'avez pas la capacité de script nécessaire.
Avez-vous pu trouver un moyen de le faire? J'ai actuellement besoin de faire du dwass en acier mais je n'ai aucune idée de comment obtenir les lettres de connexion. Toute aide est la bienvenue. Merci!