<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />Wenn Sie einen ähnlichen Test wie Tukeys JMP ausführen, wird ein "Bericht zum Verbinden von Buchstaben" erstellt. Unsere Daten sind jedoch nicht normal und die Varianzen sind heterogen, daher 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?
Vielen Dank,
Zach
Ich konnte die readxl-Bibliothek verwenden, um die xls-Eingabe direkt zu lesen
Bibliothek ("readxl")
Die Eingabe-Excel-Datei sollte wie folgt mit zwei Spalten eingerichtet werden. Wobei A,B die Spalten und 1,2,3 die Zeilen sind
Ein B
paarweiser Vergleich p.Wert
1 Juni-August 0,1637
2 Nov-August 0,1093
3 Nov-Juli 0,9316
Können Sie (oder jemand anderes) ein vollständiges Beispiel für eine kleine Eingabedatei, den Code und die Ausgabe für den obigen Prozess zur Durchführung des Vorgangs posten Anzeige kompakter Buchstaben nach nichtparametrischer Analyse mit paarweisen Post-Hoc-Vergleichen aus einer Excel- oder Texteingabedatei.
Ich dachte, ich würde diesen Beitrag aktualisieren, da ich einen Weg gefunden habe, eine kompakte Buchstabenanzeige nach nichtparametrischer Analyse mit paarweisen Post-Hoc-Vergleichen zu erstellen.
HINWEIS: Dies erfordert das Open-Source- und leicht verfügbare Statistikprogramm R (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 Feld des Vergleichs 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 von 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)
}
Machen Sie im Anschluss daran eine weitere Funktion aus diesem Skript aus 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)))
# }
Sie können dann die neu erstellte make_cld_df-Funktion auf Ihre Daten in folgender Form anwenden:
x<-make_cld_df(p.value~paarweiser Vergleich, data=data.
Rufen Sie dann x an
Ich würde überprüfen, ob sich die Verbesserungsanfrage in der JMP-Wunschliste befindet, und falls nicht, füge sie der Liste hinzu
Vier Jahre später wünschte ich mir immer noch, es hätte diese Funktion.
Es scheint, dass es keine Möglichkeit gibt, in das Programm integriert zu sein, und ich bin mit dem Codieren nicht vertraut (daher verwende ich JMP anstelle von SAS). Ich kann mir vorstellen, dass SAS dafür mehr Optionen hat, aber ich bin wegen der Benutzerfreundlichkeit zu JMP gewechselt. 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 auf die Welch ANOVA zu verlassen, wenn dies nicht der Fall ist.
Es stellt sich heraus, dass die Annahme der Normalität nicht immer erfüllt sein muss:
Experimente in der Ökologie, von AJ Unterholz. 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 skripten, haben aber nicht die erforderlichen Skriptfähigkeiten.
Konnten Sie einen Weg finden, dies zu tun? Ich muss derzeit auch ein paar Stahldwass machen, habe aber keine Ahnung, wie ich die Verbindungsbuchstaben bekomme. Jede Hilfe wäre großartig. Vielen Dank!