R中元素明智的prop.test

时间:2015-03-26 21:21:33

标签: r

我试图创建一个函数,在x和x2变量之间的R中执行元素明智的prop.test,并返回每个测试的p值列表。 x1和x2表示每个类别的成功次数。我当时认为应该采取措施,但我无法弄清楚如何让它发挥作用。

set.seed(4576)

x1 <- round(runif(15, 200, 1000))
x2 <- round(runif(15, 200, 1000))

p <- cbind(x1, x2)

       x1  x2
 [1,] 919 559
 [2,] 471 975
 [3,] 537 792
 [4,] 776 524
 [5,] 329 603
 [6,] 201 610
 [7,] 520 353
 [8,] 461 853
 [9,] 491 765
[10,] 527 358
[11,] 248 331
[12,] 953 322
[13,] 453 680
[14,] 401 654
[15,] 962 358

function(data) {

    n1 <- sum(data[,1])
    n2 <- sum(data[,2])

    sapply(data, function(x) {

    prop.test(x = c(data[,1], data[,2]), n = c(n1, n2) )$p.value   

    } )

}

我可能只是误解了如何使用sapply,但任何帮助都会受到赞赏!

1 个答案:

答案 0 :(得分:2)

对于行索引sapply可能最简单,那么您不必手动从p中提取每个值。

sapply(1:nrow(p), function(z) prop.test(p[z,, drop = FALSE])$p.value)
#  [1] 9.810393e-21 6.072933e-40 3.228340e-12 3.366985e-12 3.807659e-19 1.487836e-46 1.929026e-08 3.988440e-27 1.327621e-14 1.630269e-08 6.548799e-04
# [12] 1.141069e-69 1.891166e-11 8.598155e-15 7.322714e-62

您的数据代表的内容并不十分清楚,但我在上面假设p中的两列分别是成功和失败的计数。

这很重要,因为R实际上会根据您提供的数据结构执行不同的比例测试。例如:

> sapply(1:nrow(p), function(z) prop.test(p[z,, drop = FALSE], n = colSums(p))$p.value)
 [1] 9.810393e-21 6.072933e-40 3.228340e-12 3.366985e-12 3.807659e-19 1.487836e-46 1.929026e-08 3.988440e-27 1.327621e-14 1.630269e-08 6.548799e-04 1.141069e-69
[13] 1.891166e-11 8.598155e-15 7.322714e-62
> sapply(1:nrow(p), function(z) prop.test(p[z,, drop = TRUE], n = colSums(p))$p.value)
 [1] 7.981801e-28 6.509059e-37 6.883520e-10 8.391497e-17 1.044857e-16 1.291989e-43 3.079194e-11 3.329273e-24 3.663355e-12 2.373325e-11 5.689494e-03 5.212655e-84
[13] 2.658030e-09 1.781938e-12 2.023293e-75

这些数字都是0的浮点表示,所以这种情况下的不同是不相关的,但是如果你看一下这两种不同类型代码的单次迭代,你就会看到R在做什么不同因此它为什么给你不同的p值:

> prop.test(p[1,, drop = FALSE], n = colSums(p))

        1-sample proportions test with continuity correction

data:  p[1, , drop = FALSE], null probability 0.5
X-squared = 87.1996, df = 1, p-value < 2.2e-16
alternative hypothesis: true p is not equal to 0.5
95 percent confidence interval:
 0.5964359 0.6464965
sample estimates:
        p 
0.6217862 

> prop.test(p[1,, drop = TRUE], n = colSums(p))

        2-sample test for equality of proportions with continuity correction

data:  p[1, , drop = TRUE] out of colSums(p)
X-squared = 119.5388, df = 1, p-value < 2.2e-16
alternative hypothesis: two.sided
95 percent confidence interval:
 0.03879812 0.05605522
sample estimates:
    prop 1     prop 2 
0.11140744 0.06398077

提供n参数实际上并不重要drop = FALSE(即,如果提供矩阵),因为它正在执行的测试是对行中两个数字的比较。

听起来这不是你想要的,所以你应该指定drop = TRUE(这是默认值,因此你实际上不必提供它),但指定n,正如我在上面的第二组代码中所做的那样。