<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />Wenn Sie einen ähnlichen Test wie den von Tukey ausführen, generiert JMP einen „Verbindungsbriefbericht“. Da unsere Daten jedoch nicht normal sind und die Varianzen heterogen sind, mussten wir den Kruskal-Wallis-Test verwenden, um die Varianz zu untersuchen, und dann Steel-Dwass verwenden, um die Mittelwerte für alle Behandlungspaare zu vergleichen. Wie können wir nach dieser Analyse einen ähnlichen Briefbericht erhalten?
Danke,
Zach
Ich konnte die readxl-Bibliothek verwenden, um die XLS-Eingabe direkt zu lesen
Bibliothek("readxl")
Die Eingabe-Excel-Datei sollte wie folgt aufgebaut sein, mit zwei Spalten. Wobei A,B die Spalten und 1,2,3 die Zeilen sind
A B
Paarweiser Vergleich p.value
1 Juni-August 0,1637
2 Nov.-Aug. 0,1093
3 Nov.-Juli 0,9316
Können Sie (oder jemand anderes) ein vollständiges Beispiel einer kleinen Eingabedatei, des Codes und der Ausgabe für den oben genannten Prozess veröffentlichen, um den auszuführen? Anzeige kompakter Buchstaben nach nichtparametrischer Analyse mit post-hoc-paarweisen Vergleichen aus einer Excel- oder Texteingabedatei.
Ich dachte, ich würde diesen Beitrag aktualisieren, da ich eine Möglichkeit gefunden habe, nach einer nichtparametrischen Analyse mit paarweisen Post-hoc-Vergleichen eine kompakte Buchstabenanzeige zu erstellen.
HINWEIS: Hierzu ist das Open-Source- und leicht verfügbare Statistikprogramm R erforderlich (ich habe RStudio verwendet, eine benutzerfreundlichere Version).
Nachdem Sie Ihre nichtparametrische Analyse in JMP durchgeführt haben, exportieren Sie die Ergebnistabelle mit paarweisen p-Werten in eine Excel-Tabelle. Anschließend müssen Sie das Vergleichsfeld so formatieren, dass es sich in einer Zelle befindet und die zu vergleichenden Variablen durch ein einzelnes „-“ getrennt sind.
Erstellen Sie dann in R eine Funktion mit diesem Skript aus 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)
}
Erstellen Sie anschließend eine weitere Funktion aus diesem Skript 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)))
# }
Anschließend können Sie die neu erstellte Funktion make_cld_df in folgender Form auf Ihre Daten anwenden:
x<-make_cld_df(p.value~pairwisecomparison, data=data.
dann rufe x auf
Ich würde prüfen, ob die Verbesserungsanfrage in der JMP-Wunschliste enthalten ist, und wenn nicht, füge ich sie der Liste hinzu
Vier Jahre später wünschte ich mir immer noch, es hätte diese Funktion.
Es scheint, dass es keine in das Programm integrierte Möglichkeit gibt, und ich kenne mich mit der Codierung nicht aus (daher verwende ich JMP anstelle von SAS). Ich kann mir vorstellen, dass SAS hierfür mehr Optionen bietet, aber ich bin wegen der Benutzerfreundlichkeit auf JMP umgestiegen. Abhängig von Ihren Daten kann es in Ordnung sein, einfach eine ANOVA durchzuführen und Tukeys oder ähnliches zu verwenden, wenn Sie die Varianz mit einer Transformation korrigieren können, oder sich andernfalls auf die Welch-ANOVA zu verlassen.
Es stellt sich heraus, dass die Annahme der Normalität nicht immer erfüllt sein muss:
Experimente in der Ökologie, von AJ Underwood. 2006. Cambridge University Press ( Seiten 192-193)
Ich habe auch nach einer Möglichkeit gesucht, dies zu tun. Ich bin sicher, Sie könnten es irgendwie per Skript erstellen, verfügen aber nicht über die erforderlichen Skriptfähigkeiten.
Konnten Sie einen Weg finden, dies zu tun? Ich muss derzeit auch etwas Stahl-Dwas machen, habe aber keine Ahnung, wie ich die Verbindungsbuchstaben bekomme. Jede Hilfe wäre großartig. Danke schön!