<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />Si ejecuta una prueba similar como JMP de Tukey genera un "informe de letras de conexión". Sin embargo, nuestros datos no son normales y las varianzas son heterogéneas, por lo que necesitábamos usar la prueba de Kruskal-Wallis para examinar la varianza y luego usamos Steel-Dwass para comparar las medias de todos los pares de tratamientos. ¿Cómo podemos obtener un informe de cartas similares después de hacer este análisis?
Gracias,
zach
Pude usar la biblioteca readxl para leer la entrada xls directamente
biblioteca("leerxl")
El archivo de Excel de entrada debe configurarse así, con dos columnas. Donde A,B son las columnas y 1,2,3 son las filas
un b
valor de p de comparación por pares
1 junio-agosto 0,1637
2 noviembre-agosto 0,1093
3 noviembre-julio 0,9316
¿Puede usted (o alguien más) publicar un ejemplo completo de un pequeño archivo de entrada, el código y la salida del proceso anterior para llevar a cabo el visualización de letras compactas después de un análisis no paramétrico con comparaciones por pares post-hoc desde un archivo de entrada de texto o de Excel.
Pensé en actualizar esta publicación ya que encontré una manera de producir una pantalla de letras compactas después de un análisis no paramétrico con comparaciones por pares post-hoc.
NOTA: Esto requiere el programa estadístico R de código abierto y fácilmente disponible (utilicé RStudio, una versión más fácil de usar).
Después de realizar su análisis no paramétrico en JMP, exporte la tabla de resultados con valores p por pares a una hoja de Excel. Luego debe formatear el campo de la comparación para que esté en una celda, con un solo '-' separando las variables que se comparan.
Luego, en R, crea una función usando este script 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)
}
Después de esto, haga otra función de este script 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)))
# }
A continuación, puede aplicar la función make_cld_df recién creada a sus datos en forma de:
x<-make_cld_df(p.valor~comparación por pares, datos=datos.
entonces llama x
Verificaría para asegurarme de que la solicitud de mejora esté en la lista de deseos de JMP y, de no ser así, la agregaría a la lista.
Cuatro años después, todavía deseaba tener esta función.
Parece que el programa no está integrado de ninguna manera, y no soy experto en codificación (por lo tanto, uso JMP en lugar de SAS). Me imagino que SAS tiene más opciones para esto, pero cambié a JMP por la facilidad de uso. Dependiendo de sus datos, puede estar bien simplemente ejecutar un ANOVA y usar el de Tukey o similar si puede corregir la varianza con una transformación o confiar en el ANOVA de Welch si no.
Resulta que el supuesto de normalidad no siempre tiene que cumplirse:
Experimentos en Ecología, por AJ Sotobosque. 2006. Prensa de la Universidad de Cambridge ( páginas 192-193)
También he estado buscando una manera de hacer esto, estoy seguro de que podría escribirlo de alguna manera, pero no tiene la capacidad de creación de scripts necesaria.
¿Pudiste encontrar una manera de hacer esto? Actualmente también necesito hacer algunos dwass de acero, pero no tengo idea de cómo obtener las letras de conexión. Cualquier ayuda sería genial. ¡Gracias!