【问题标题】:How to get df and t-values from pairwise.t.test?如何从 pairwise.t.test 中获取 df 和 t 值?
【发布时间】:2014-12-18 10:31:10
【问题描述】:

有没有办法从pairwise.t.test 中获取相关数据的 t 值和 df?

例子:

 data<-c(2,3,2,2,5,2,4,2,4,3,4,2)
 time<-c(1,1,1,1,2,2,2,2,3,3,3,3)

 pairwise.t.test(data, time,p.adjust.method= "bonf",paired=TRUE)

给我:

  Pairwise comparisons using paired t tests 

 data:  data and time 

   1    2   
 2 1.00 -   
 3 0.55 1.00

 P value adjustment method: bonferroni 

我希望 t 值和 df 的格式相同。

【问题讨论】:

  • 来自文档:This method does not actually call t.test, so extra arguments are ignored. 检查?pairwise.t.test。您可能需要自己计算。

标签: r statistics


【解决方案1】:

您可以通过编写自定义函数从pairwise.t.test 中获取df 和t 值。这是一个可以做到这一点的函数:

pairwise.t.test.with.t.and.df <- function (x, g, p.adjust.method = p.adjust.methods, pool.sd = !paired, 
                                           paired = FALSE, alternative = c("two.sided", "less", "greater"), 
                                           ...) 
{
    if (paired & pool.sd) 
        stop("pooling of SD is incompatible with paired tests")
    DNAME <- paste(deparse(substitute(x)), "and", deparse(substitute(g)))
    g <- factor(g)
    p.adjust.method <- match.arg(p.adjust.method)
    alternative <- match.arg(alternative)
    if (pool.sd) {
        METHOD <- "t tests with pooled SD"
        xbar <- tapply(x, g, mean, na.rm = TRUE)
        s <- tapply(x, g, sd, na.rm = TRUE)
        n <- tapply(!is.na(x), g, sum)
        degf <- n - 1
        total.degf <- sum(degf)
        pooled.sd <- sqrt(sum(s^2 * degf)/total.degf)
        compare.levels <- function(i, j) {
            dif <- xbar[i] - xbar[j]
            se.dif <- pooled.sd * sqrt(1/n[i] + 1/n[j])
            t.val <- dif/se.dif
            if (alternative == "two.sided") 
                2 * pt(-abs(t.val), total.degf)
            else pt(t.val, total.degf, lower.tail = (alternative == 
                                                         "less"))
        }
        compare.levels.t <- function(i, j) {
            dif <- xbar[i] - xbar[j]
            se.dif <- pooled.sd * sqrt(1/n[i] + 1/n[j])
            t.val = dif/se.dif 
            t.val
        }       
    }
    else {
        METHOD <- if (paired) 
            "paired t tests"
        else "t tests with non-pooled SD"
        compare.levels <- function(i, j) {
            xi <- x[as.integer(g) == i]
            xj <- x[as.integer(g) == j]
            t.test(xi, xj, paired = paired, alternative = alternative, 
                   ...)$p.value
        }
        compare.levels.t <- function(i, j) {
            xi <- x[as.integer(g) == i]
            xj <- x[as.integer(g) == j]
            t.test(xi, xj, paired = paired, alternative = alternative, 
                   ...)$statistic
        }
        compare.levels.df <- function(i, j) {
            xi <- x[as.integer(g) == i]
            xj <- x[as.integer(g) == j]
            t.test(xi, xj, paired = paired, alternative = alternative, 
                   ...)$parameter
        }
    }
    PVAL <- pairwise.table(compare.levels, levels(g), p.adjust.method)
    TVAL <- pairwise.table.t(compare.levels.t, levels(g), p.adjust.method)
    if (pool.sd) 
        DF <- total.degf
    else
        DF <- pairwise.table.t(compare.levels.df, levels(g), p.adjust.method)           
    ans <- list(method = METHOD, data.name = DNAME, p.value = PVAL, 
                p.adjust.method = p.adjust.method, t.value = TVAL, dfs = DF)
    class(ans) <- "pairwise.htest"
    ans
}
pairwise.table.t <- function (compare.levels.t, level.names, p.adjust.method) 
{
    ix <- setNames(seq_along(level.names), level.names)
    pp <- outer(ix[-1L], ix[-length(ix)], function(ivec, jvec) sapply(seq_along(ivec), 
        function(k) {
            i <- ivec[k]
            j <- jvec[k]
            if (i > j)
                compare.levels.t(i, j)               
            else NA
        }))
    pp[lower.tri(pp, TRUE)] <- pp[lower.tri(pp, TRUE)]
    pp
}

示例执行:

data<-c(2,3,2,2,5,2,4,2,4,3,4,2)
time<-c(1,1,1,1,2,2,2,2,3,3,3,3)

result <- pairwise.t.test.with.t.and.df(data, time,p.adjust.method= "bonf",paired=TRUE)

# Print t-values
result[[5]]

# Print dfs
result[[6]]

【讨论】:

  • 扩展 stats::pairwise.t.test 很聪明,但这种方法的缺点是您执行的 t 检验要多执行三倍,而不是重复使用这些值。这可能会对性能产生重大影响。
【解决方案2】:

可以从t.test中提取df和统计值。

t.test(data, time, paired = TRUE)

Paired t-test

data:  data and time
t = 2.9304, df = 11, p-value = 0.01368
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
 0.2281644 1.6051689
 sample estimates:
 mean of the differences 
               0.9166667

#Extract parameters
result<-t.test(data,time,paired = TRUE)
result$statistic
       t 
2.930375 
result$parameter
df 
11 

【讨论】:

    猜你喜欢
    • 2020-06-25
    • 1970-01-01
    • 1970-01-01
    • 2022-11-15
    • 2012-05-06
    • 2020-09-23
    • 1970-01-01
    • 1970-01-01
    • 2020-12-22
    相关资源
    最近更新 更多