<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />Se esegui un test simile come JMP di Tukey, viene generato un "rapporto lettere di collegamento". Tuttavia i nostri dati non sono normali e le varianze sono eterogenee, quindi abbiamo dovuto utilizzare il test di Kruskal-Wallis per esaminare la varianza e quindi abbiamo utilizzato Steel-Dwass per confrontare le medie per tutte le coppie di trattamenti. Come possiamo ottenere un rapporto di lettere simili dopo aver eseguito questa analisi?
Grazie,
Zach
Sono stato in grado di utilizzare la libreria readxl per leggere direttamente l'input xls
libreria("readxl")
Il file excel di input dovrebbe essere impostato in questo modo, con due colonne. Dove A,B sono le colonne e 1,2,3 sono le righe
A B
pairwisecomparison p.value
1 giugno-agosto 0,1637
2 novembre-agosto 0,1093
3 novembre-luglio 0,9316
Puoi (o qualcun altro) pubblicare un esempio completo di un piccolo file di input, il codice e l'output per il processo sopra per eseguire il visualizzazione delle lettere compatte dopo l'analisi non parametrica con confronti a coppie post-hoc da un file excel o di input di testo.
Ho pensato di aggiornare questo post poiché ho trovato un modo per produrre una visualizzazione di lettere compatte dopo un'analisi non parametrica con confronti a coppie post-hoc.
NOTA: Ciò richiede il programma statistico R open source e prontamente disponibile (ho usato RStudio, una versione più intuitiva).
Dopo aver eseguito l'analisi non parametrica in JMP, esportare la tabella dei risultati con i valori p a coppie in un foglio excel. È quindi necessario formattare il campo del confronto in modo che sia in una cella, con un singolo '-' che separa le variabili da confrontare.
Quindi, in R, crea una funzione usando questo script da 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)
}
Successivamente, crea un'altra funzione da questo script da 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)))
# }
Puoi quindi applicare la nuova funzione make_cld_df ai tuoi dati sotto forma di::
x<-make_cld_df(p.value~pairwisecomparison, data=data.
quindi chiama x
Vorrei verificare che la richiesta di miglioramento sia nell'elenco dei desideri di JMP e, in caso contrario, aggiungerla all'elenco
Quattro anni dopo, ancora desiderando che avesse questa caratteristica.
Sembra che non ci sia alcun modo integrato nel programma e non sono esperto di programmazione (quindi utilizzo JMP invece di SAS). Immagino che SAS abbia più opzioni per questo, ma sono passato a JMP per la facilità d'uso. A seconda dei tuoi dati, potrebbe essere utile eseguire semplicemente un'ANOVA e utilizzare Tukey o simili se puoi correggere la varianza con una trasformazione o fare affidamento sull'ANOVA Welch in caso contrario.
Risulta che il presupposto della normalità non deve sempre essere soddisfatto:
Esperimenti in ecologia, di AJ Sottobosco. 2006. Cambridge University Press ( pagine 192-193)
Ho anche cercato un modo per farlo, sono sicuro che potresti scriverlo in qualche modo ma non hai la capacità di scripting necessaria.
Sei riuscito a trovare un modo per farlo? Al momento ho bisogno di fare anche un po' di steel dwass, ma non ho idea di come ottenere le lettere di collegamento. Qualsiasi aiuto sarebbe grande. Grazie!