# File src/library/stats/R/friedman.test.R # Part of the R package, https://www.R-project.org # # Copyright (C) 1995-2015 The R Core Team # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # A copy of the GNU General Public License is available at # https://www.R-project.org/Licenses/ friedman.test <- function(y, ...) UseMethod("friedman.test") friedman.test.default <- function(y, groups, blocks, ...) { DNAME <- deparse1(substitute(y)) if (is.matrix(y)) { groups <- factor(c(col(y))) blocks <- factor(c(row(y))) } else { if (anyNA(groups) || anyNA(blocks)) stop("NA's are not allowed in 'groups' or 'blocks'") if (any(diff(c(length(y), length(groups), length(blocks))) != 0L)) stop("'y', 'groups' and 'blocks' must have the same length") DNAME <- paste0(DNAME, ", ", deparse1(substitute(groups)), " and ", deparse1(substitute(blocks))) if (any(table(groups, blocks) != 1)) stop("not an unreplicated complete block design") groups <- factor(groups) blocks <- factor(blocks) ## Need to ensure consistent order of observations within ## blocks. o <- order(groups, blocks) y <- y[o] groups <- groups[o] blocks <- blocks[o] } k <- nlevels(groups) ## y <- matrix(unlist(split(c(y), blocks)), ncol = k, byrow = TRUE) y <- y[complete.cases(y), ] n <- nrow(y) r <- t(apply(y, 1L, rank)) ## TIES <- tapply(c(r), row(r), table) STATISTIC <- 12 * sum((colSums(r) - n * (k + 1) / 2)^2) / (n * k * (k + 1) - sum(unlist(lapply(TIES, function(u) u^3 - u))) / (k-1)) PARAMETER <- k - 1 PVAL <- pchisq(STATISTIC, PARAMETER, lower.tail = FALSE) names(STATISTIC) <- "Friedman chi-squared" names(PARAMETER) <- "df" structure(list(statistic = STATISTIC, parameter = PARAMETER, p.value = PVAL, method = "Friedman rank sum test", data.name = DNAME), class = "htest") } friedman.test.formula <- function(formula, data, subset, na.action, ...) { if(missing(formula)) stop("formula missing") ## ## Maybe put this into an internal rewriteTwoWayFormula() when ## adding support for strata() if((length(formula) != 3L) || (length(formula[[3L]]) != 3L) || (formula[[3L]][[1L]] != as.name("|")) || (length(formula[[3L]][[2L]]) != 1L) || (length(formula[[3L]][[3L]]) != 1L)) stop("incorrect specification for 'formula'") formula[[3L]][[1L]] <- as.name("+") ## m <- match.call(expand.dots = FALSE) m$formula <- formula if(is.matrix(eval(m$data, parent.frame()))) m$data <- as.data.frame(data) ## need stats:: for non-standard evaluation m[[1L]] <- quote(stats::model.frame) mf <- eval(m, parent.frame()) DNAME <- paste(names(mf), collapse = " and ") names(mf) <- NULL y <- do.call("friedman.test", as.list(mf)) y$data.name <- DNAME y }