var.test <- function(x, alternative='two.sided', null.value=1, conf.level=0.95) { alpha <- 1 - conf.level n <- length(x) if (alternative == 'two.sided') { alt <- 'not equal to' quantiles <- c(qchisq(p=alpha/2, df=n-1, lower.tail=F), qchisq(p=1-alpha/2, df=n-1, lower.tail=F)) conf.int <- (n-1) * var(x) / quantiles statistic <- (n-1) * var(x) / null.value p.value <- 2 * min(c(pchisq(statistic, n-1, lower.tail=F), pchisq(statistic, n-1, lower.tail=T))) } if (alternative == 'less') { alt <- 'less than' quantiles <- c(qchisq(p=conf.level, df=n-1, lower.tail=F), 0) conf.int <- (n-1) * var(x) / quantiles statistic <- (n-1) * var(x) / null.value p.value <- pchisq(statistic, n-1) } if (alternative == 'greater') { alt <- 'greater than' quantiles <- c(0, qchisq(p=conf.level, df=n-1, lower.tail=T)) conf.int <- (n-1) * var(x) / quantiles statistic <- (n-1) * var(x) / null.value p.value <- pchisq(statistic, n-1, lower.tail=F) } res <- list(conf.int=conf.int, statistic=statistic, df=n-1, alternative=alternative, alt=alt, null.value=null.value, conf.level=conf.level, data.name=deparse(substitute(x)), p.value=p.value, sample.var=var(x)) class(res) <- "vartest" res } var_test_one <- function(varx, nx, alternative, conf.level, null.value) { alpha <- 1 - conf.level # Alternative two.sided if (alternative == 'two.sided') { quantiles <- c(qchisq(p=alpha/2, df=nx-1, lower.tail=F), qchisq(p=1-alpha/2, df=nx-1, lower.tail=F)) conf.int <- (nx-1) * varx / quantiles statistic <- (nx-1) * varx / null.value p.value <- 2 * min(c(pchisq(statistic, nx-1, lower.tail=F), pchisq(statistic, nx-1, lower.tail=T))) } # Alternative less if (alternative == 'less') { quantiles <- c(qchisq(p=conf.level, df=nx-1, lower.tail=T), 0) conf.int <- (nx-1) * varx / quantiles statistic <- (nx-1) * varx / null.value p.value <- pchisq(statistic, nx-1) } # Alternative greater if (alternative == 'greater') { quantiles <- c(Inf, qchisq(p=conf.level, df=nx-1, lower.tail=F)) conf.int <- (nx-1) * varx / quantiles statistic <- (nx-1) * varx / null.value p.value <- pchisq(statistic, nx-1, lower.tail=F) } # To ensure that the output values are in the correct form names(statistic) <- 'X-squared' parameter <- nx - 1 names(parameter) <- 'df' attr(conf.int, 'conf.level') <- conf.level estimate <- varx names(estimate) <- 'variance of x' method <- 'X-squared test for variance' data.name <- paste('varx =', varx, 'and nx =', nx) res <- list(statistic=statistic, parameter=parameter, p.value=p.value, conf.int=conf.int, estimate=estimate, null.value=null.value, alternative=alternative, method=method, data.name=data.name) return(res) } var_test_two <- function(varx, nx, vary, ny, alternative, conf.level, null.value) { alpha <- 1 - conf.level # Alternative two.sided if (alternative == 'two.sided') { quantiles <- c(qf(p=alpha/2, df1=nx-1, df2=ny-1, lower.tail=F), qf(p=1-alpha/2, df1=nx-1, df2=ny-1, lower.tail=F)) conf.int <- (varx / vary) / quantiles statistic <- (varx / vary) / null.value p.value <- 2 * min(c(pf(statistic, nx-1, ny-1, lower.tail=F), pf(statistic, nx-1, ny-1, lower.tail=T))) } # Alternative less if (alternative == 'less') { quantiles <- c(Inf, qf(p=conf.level, df1=nx-1, df2=ny-1, lower.tail=F)) conf.int <- (varx / vary) / quantiles statistic <- (varx / vary) / null.value p.value <- pf(q=statistic, df1=nx-1, df2=ny-1, lower.tail=T) } # Alternative greater if (alternative == 'greater') { quantiles <- c(qf(p=conf.level, df1=nx-1, df2=ny-1, lower.tail=T), 0) conf.int <- (varx / vary) / quantiles statistic <- (varx / vary) / null.value p.value <- pf(q=statistic, df1=nx-1, df2=ny-1, lower.tail=F) } # To ensure that the output values are in the correct form names(statistic) <- 'F' parameter <- c(nx-1, ny-1) names(parameter) <- c('num df', 'denom df') attr(conf.int, 'conf.level') <- conf.level estimate <- varx / vary names(estimate) <- 'ratio of variances' method <- 'F test to compare two variances' data.name <- paste('varx =', varx, ', nx =', nx, ', vary =', vary, 'and ny =', ny) res <- list(statistic=statistic, parameter=parameter, p.value=p.value, conf.int=conf.int, estimate=estimate, null.value=null.value, alternative=alternative, method=method, data.name=data.name) return(res) }