数据框中每行的卡方检验

时间:2015-01-28 12:55:32

标签: r

我有一个数据框,其中包含同一进程的两个观察者的独立计数。

obs.1 <- c(2,10,53,13,12,15,5)
obs.2 <- c(3,12,45,2,7,17,5)
df <- data.frame(obs.1,obs.2)

我想在每一行上使用卡方检验(R“MASS”中的chisq.test)来检查obs.1与obs.2之间是否存在显着差异。我想将结果(x平方,p值)添加到df。我觉得apply函数是实现它的正确方法,但还没有成功。

3 个答案:

答案 0 :(得分:4)

以下是使用dplyr的另一个选项:

library(dplyr)

df %>%
  rowwise() %>% 
  mutate(
    test_stat = chisq.test(c(obs.1, obs.2))$statistic,
    p_val = chisq.test(c(obs.1, obs.2))$p.value
    )

答案 1 :(得分:2)

有很多方法可以做到这一点。一个是使用apply遍历每一行(MARGINE = 1),然后提取所需输出的任何部分(我使用lapply来浏览每个列表元素)。

xy <- data.frame(obs1 = c(3,12,45,2,7,17,5), obs2 = c(2,10,53,13,12,15,5))
result <- apply(X = xy, MARGIN = 1, FUN = chisq.test)

Warning message:
In FUN(newX[, i], ...) : Chi-squared approximation may be incorrect

# see where p-value is stored
str(chisq.test(xy[1, ]))

List of 9
 $ statistic: Named num 0.2
  ..- attr(*, "names")= chr "X-squared"
 $ parameter: Named num 1
  ..- attr(*, "names")= chr "df"
 $ p.value  : num 0.655 # thar she blows
 $ method   : chr "Chi-squared test for given probabilities"
 $ data.name: chr "xy[1, ]"
 $ observed : num [1:2] 3 2
 $ expected : num [1:2] 2.5 2.5
 $ residuals: num [1:2] 0.316 -0.316
 $ stdres   : num [1:2] 0.447 -0.447
 - attr(*, "class")= chr "htest"

Warning message:
In chisq.test(xy[1, ]) : Chi-squared approximation may be incorrect

unlist(lapply(result, "[", "p.value"), use.names = FALSE)

[1] 0.654720846 0.669815358 0.419020334 0.004508698 0.251349109 0.723673610 1.000000000

答案 2 :(得分:2)

您可以将apply与“MARGIN = 1”一起使用,然后执行chisq.test。使用$statistic$p.valuecbind将值提取到数据集中。

 df1 <- cbind(df, t(apply(df, 1, function(x) {
             ch <- chisq.test(x)
             c(unname(ch$statistic), ch$p.value)})))

 colnames(df1)[3:4] <- c('x-squared', 'p-value')