【问题标题】:t-test across selected columns of R data frame跨 R 数据框的选定列的 t 检验
【发布时间】:2014-03-16 04:03:48
【问题描述】:

我有一个相对简单的问题,我认为我不能正确地使用 R。

我有一个数据框,其中包含多个观察结果,存储在行中,还有一堆我不想丢失的注释,位于同一数据框的其他列中。

我想对数据框的几列中的值进行 t 检验,并将结果写入(理想情况下)相同的数据框。

一个简单的例子是:

# Generate the data
experimentName <- paste(rep("name",20), c(1:20), sep="")
experimentAnno1 <- rep(paste(rep("anno",5), c(1:5), sep=""), 4)
a1 <- rnorm(n=20, mean=10, sd=5)
a2 <- rnorm(n=20, mean=11, sd=5)
a3 <- rnorm(n=20, mean=12, sd=5)
b1 <- rnorm(n=20, mean=20, sd=5)
b2 <- rnorm(n=20, mean=21, sd=5)
b3 <- rnorm(n=20, mean=19, sd=5)

sampledata <- cbind(experimentName, experimentAnno1, a1,a2,a3,b1,b2,b3)

所以我尝试了一个非常简单的

ttestfun = function(x) t.test(x[,c("a1", "a2", "a3")], x[,c("b1", "b2", "b3")])$p.value
p.value = apply(sampledata, 1, ttestfun)

这不起作用:(

我还尝试了 by()、melt()、apply() 等的一大堆组合 - 所有这些我都认为我做错了。

我希望得到的结果是 sampledata 数据框中的其他列:

# pValue
p.value
# LoConf
a$conf.int[1]
# UpConf
a$conf.int[2]

等等

最有效的方法是什么?

提前致谢!

【问题讨论】:

    标签: r plyr apply


    【解决方案1】:

    您需要先将sampledata 设为data.frame,以获取“a”和“b”列中的数值。

    > sampledata <- data.frame(experimentName, experimentAnno1, a1,a2,a3,b1,b2,b3)
    

    如果您尝试基于 Welch 两样本 t 检验获取每行统计信息,这种方法既快速又相对简单。

    > stats <- as.data.frame(do.call(rbind, lapply(1:nrow(sampledata), function(i){
        as.numeric(unlist(t.test(sampledata[i, 3:5], sampledata[i, 6:8]))[1:5])
        })))
    > names(stats) <- c("t.stat", "param.df", "p.val", "ci.left", "ci.right")
    > cbind(sampledata, stats)
    

    【讨论】:

    • +1 这比我的效率高,打字少得多!但是你从哪里得到tests
    【解决方案2】:

    可能不是最有效的,但这是建立在您最初努力的基础上的一种方法。

    您的示例数据:

    experimentName <- paste(rep("name",20), c(1:20), sep="")
    experimentAnno1 <- rep(paste(rep("anno",5), c(1:5), sep=""), 4)
    a1 <- rnorm(n=20, mean=10, sd=5)
    a2 <- rnorm(n=20, mean=11, sd=5)
    a3 <- rnorm(n=20, mean=12, sd=5)
    b1 <- rnorm(n=20, mean=20, sd=5)
    b2 <- rnorm(n=20, mean=21, sd=5)
    b3 <- rnorm(n=20, mean=19, sd=5)
    

    我使用data.frame 而不是cbind,因此我们可以将数字保留为数字(cbind 将它们强制转换为字符)

    # sampledata <- cbind(experimentName, experimentAnno1, a1,a2,a3,b1,b2,b3)
    sampledata <- data.frame(experimentName, experimentAnno1, a1,a2,a3,b1,b2,b3)
    

    似乎您的目标是在每一行中,针对 b1、b2、b3 的集合测试 a1、a2、a3 的集合

    以下是一些获取这些值的lapply 函数:

    sampledata$pvalue <- sapply(1:nrow(sampledata), function(i) t.test(sampledata[i,c("a1", "a2", "a3")], sampledata[i,c("b1", "b2", "b3")])$p.value)
    
    sampledata$LoConf <- sapply(1:nrow(sampledata), function(i) t.test(sampledata[i,c("a1", "a2", "a3")], sampledata[i,c("b1", "b2", "b3")])$conf.int[1])
    
    sampledata$UpConf <- sapply(1:nrow(sampledata), function(i) t.test(sampledata[i,c("a1", "a2", "a3")], sampledata[i,c("b1", "b2", "b3")])$conf.int[2])
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-12-25
      • 1970-01-01
      • 2021-05-21
      • 1970-01-01
      • 1970-01-01
      • 2013-04-24
      • 1970-01-01
      相关资源
      最近更新 更多