循环统计测试

时间:2013-01-31 09:58:11

标签: r

我是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

我想在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))
}

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

有人能帮帮我吗? 如果问题不明确,请告诉我。我会在一秒钟内编辑它。

最好,

˚F

2 个答案:

答案 0 :(得分: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))
 }
}

我的女佣的测试与你的问题中的安静不同,但我认为这是你需要的(如果吸烟者/没有吸烟者的比例与男性/女性相同,我会测试)< / p>

编辑:

将结果保存在列表中:

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)
 }
}

答案 1 :(得分:0)

假设您的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()