Rで統計的仮説検定:バートレット検定

Rでデータサイエンス

バートレット検定

  • 帰無仮説:正規分布に従う複数群(3群以上)の分散は等しい。

サンプル

seed <- 20230428
# 3群の標準偏差が同一
set.seed(seed = seed)
x <- rnorm(n = 20, mean = 0, sd = 5)
y <- rnorm(n = 40, mean = 10, sd = 5)
z <- rnorm(n = 60, mean = 20, sd = 5)
bartlett.test(x = list(x, y, z))
# 帰無仮説は棄却されない。

    Bartlett test of homogeneity of variances

data:  list(x, y, z)
Bartlett's K-squared = 2.4174, df = 2, p-value = 0.2986
# 3群の標準偏差が異なる
set.seed(seed = seed)
x <- rnorm(n = 20, mean = 0, sd = 5)
y <- rnorm(n = 40, mean = 10, sd = 5)
z <- rnorm(n = 60, mean = 20, sd = 10)
bartlett.test(list(x, y, z))
# 帰無仮説は棄却される。

    Bartlett test of homogeneity of variances

data:  list(x, y, z)
Bartlett's K-squared = 34.791, df = 2, p-value = 0.00000002788
# 関数コード
methods("bartlett.test")
[1] bartlett.test.default* bartlett.test.formula*
see '?methods' for accessing help and source code
getS3method(f = "bartlett.test", class = "default")
function (x, g, ...) 
{
    LM <- FALSE
    if (is.list(x)) {
        if (length(x) < 2L) 
            stop("'x' must be a list with at least 2 elements")
        DNAME <- deparse1(substitute(x))
        if (all(sapply(x, function(obj) inherits(obj, "lm")))) 
            LM <- TRUE
        else x <- lapply(x, function(x) x <- x[is.finite(x)])
        k <- length(x)
    }
    else {
        if (length(x) != length(g)) 
            stop("'x' and 'g' must have the same length")
        DNAME <- paste(deparse1(substitute(x)), "and", deparse1(substitute(g)))
        OK <- complete.cases(x, g)
        x <- x[OK]
        g <- factor(g[OK])
        k <- nlevels(g)
        if (k < 2) 
            stop("all observations are in the same group")
        x <- split(x, g)
    }
    if (LM) {
        n <- sapply(x, function(obj) obj$df.resid)
        v <- sapply(x, function(obj) sum(obj$residuals^2))/n
    }
    else {
        n <- lengths(x) - 1L
        if (any(n <= 0)) 
            stop("there must be at least 2 observations in each group")
        v <- sapply(x, var)
    }
    n.total <- sum(n)
    v.total <- sum(n * v)/n.total
    STATISTIC <- ((n.total * log(v.total) - sum(n * log(v)))/(1 + 
        (sum(1/n) - 1/n.total)/(3 * (k - 1))))
    PARAMETER <- k - 1
    PVAL <- pchisq(STATISTIC, PARAMETER, lower.tail = FALSE)
    names(STATISTIC) <- "Bartlett's K-squared"
    names(PARAMETER) <- "df"
    RVAL <- list(statistic = STATISTIC, parameter = PARAMETER, 
        p.value = PVAL, data.name = DNAME, method = "Bartlett test of homogeneity of variances")
    class(RVAL) <- "htest"
    return(RVAL)
}
<bytecode: 0x000001d4899a7d88>
<environment: namespace:stats>

参考引用資料

  1. https://data-science.gr.jp/implementation/ist_r_bartlett_test.html

最終更新

Sys.time()
[1] "2024-04-03 04:33:31 JST"

R、Quarto、Package

R.Version()$version.string
[1] "R version 4.3.3 (2024-02-29 ucrt)"
quarto::quarto_version()
[1] '1.4.542'
packageVersion(pkg = "tidyverse")
[1] '2.0.0'

著者