【问题标题】:loop a statistic test循环统计检验
【发布时间】:2013-01-31 09:58:11
【问题描述】:

我是 R 的新手。我有两个如下所示的 data.frame:

DF1

 List_name     Smokers   Not_smokers    
  List1          30         100
  List2          10          50
  List3          3           10
  List4          12          85
  List5          56          60
  List6          90         120

DF2

 List_name      Male       Female    
  List1          23          123
  List2          45          654
  List3          35          110
  List4          145         850
  List5          89          234
  List6          56          765

我想在 for ex 之间应用一个 prop.test:DF2 的第一行和 DF1 的每个单行,然后 DF2 的第二行和 DF1 的每个单行,然后 DF2 的第三行和每个单行DF1 的行,依此类推,直到 DF2 的所有行结束。所以,由于 DF1 有维度:100(行)X2(列),而 DF2 有 30(行)X2(列)最后我会有 30X100 个测试,所以 3000 个测试。

我尝试的是以下内容(使用另一个已发布问题的函数):

for (i in 1:length(DF2)){ 
   test <- apply(DF1, 1, function(x) prop.test(rbind(x, as.numeric(DF2[[i]]), correct=TRUE,  alternative="two.sided", conf.level=.99))
}

但它不起作用。显然,由于我是初学者,有些错误我无法解决。另一个问题是我执行的每个测试都将保存在单独的变量中和/或打印在单独的文件中。

【问题讨论】:

    标签: r


    【解决方案1】:

    对于初学者来说最简单的方法是使用 2 个循环

    DF1 <- read.table(text='List_name Smokers Not_smokers 
     List1 30 100
     List2 10 50
     List3 3 10
     List4 12 85
     List5 56 60
     List6 90 120',header=T)
    
    DF2 <- read.table(text='List_name Male Female 
     List1 23 123
     List2 45 654
     List3 35 110
     List4 145 850
     List5 89 234
     List6 56 765', header=T)
    
    test <- NULL
    for (i in 1:nrow(DF2)) { 
     for (j in 1:nrow(DF1)) {
      test <- c(test,prop.test(c(DF1[j,2], DF2[i,2]),c(DF1[j,3]+DF1[j,2], DF2[i,3]+DF2[i,2]), correct=TRUE,  alternative="two.sided", conf.level=.99))
     }
    }
    

    我做的测试与你的问题完全不同,但我认为这是你需要的(我正在测试吸烟者/不吸烟者的比例是否与男性/女性相同)

    编辑:

    将结果保存在列表中:

    test <- list()
    for (i in 1:nrow(DF2)) { 
     for (j in 1:nrow(DF1)) {
      test[[length(test)+1]] <- prop.test(c(DF1[j,2], DF2[i,2]),c(DF1[j,3]+DF1[j,2], DF2[i,3]+DF2[i,2]), correct=TRUE,  alternative="two.sided", conf.level=.99)
     }
    }
    

    【讨论】:

    • Rcoster 的建议是可靠的。您可以将print(test) 添加到每个循环以查看结果。或者,prop.test 的结果是一个列表。您可以在循环之前首先使用results &lt;- vector("list", nrow(DF1)*nrow(DF2)) 初始化一个大小合适的空列表。然后将 test &lt;- 更改为 results[[I*j]]
    • result[[i*j]] 将订阅一些结果(如 i = 1,j = 2 和 j = 2,i = 1),result[[length(result) + 1]]如果您在开始时将结果设置为空列表,应该可以工作
    • 大家好!非常感谢您的建议!
    【解决方案2】:

    假设您的 DF1 和 DF2 对象是 data.frame。因为你使用 DF2 作为列表...

    DF1 <- data.frame(Smokers=c(30, 10, 3, 12, 56, 90), Not_smokers=c(100, 50, 10, 85, 60, 120))
    DF2 <- data.frame(M=c(23, 45, 35, 145, 89, 56), F=c(123, 654, 110, 850, 234, 765))
    
    test <- vector("list", dim(DF1)[1]*dim(DF2)[1])
    k=1
    for (i in 1:dim(DF2)[1]){
    for(j in 1:dim(DF1)[1]){
        test[[k]] <- prop.test(rbind(as.numeric(DF1[j,]), as.numeric(DF2[i,])), correct=TRUE, alternative="two.sided", conf.level=.99)
        k=k+1
    }
    }
    
    # the chi-square test produce warnings   
    warnings()
    

    【讨论】:

    • 嗨大卫!非常感谢您的帮助。我自己解决了警告。再次感谢!
    猜你喜欢
    • 2023-03-14
    • 2013-12-15
    • 1970-01-01
    • 1970-01-01
    • 2021-06-18
    • 1970-01-01
    • 2015-01-06
    • 2017-03-19
    • 2015-01-21
    相关资源
    最近更新 更多