Rev 81259 | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed
# 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)## <FIXME split.matrix>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))## <FIXME split.matrix>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 - 1PVAL <- 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")## <FIXME>## 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("+")## </FIXME>m <- match.call(expand.dots = FALSE)m$formula <- formulaif(is.matrix(eval(m$data, parent.frame())))m$data <- as.data.frame(data)## need stats:: for non-standard evaluationm[[1L]] <- quote(stats::model.frame)mf <- eval(m, parent.frame())DNAME <- paste(names(mf), collapse = " and ")y <- friedman.test(mf[[1L]], mf[[2L]], mf[[3L]])y$data.name <- DNAMEy}