Answers:
您需要McNemar检验(http://en.wikipedia.org/wiki/McNemar%27s_test,http://www.ncbi.nlm.nih.gov/pmc/articles/PMC3346204/)。以下是一个示例:
研究了1300分和1300个匹配的控件。吸烟状况如下表:
Normal
|no |yes|
Cancer|No |1000|40 |
|Yes |200 |60 |
该表的每个条目均显示有关病例对照对的信息:在1000个病例对照对中有1000表示,均不是吸烟者。病例对照对的数量为40,其中对照是吸烟者,而癌症患者不是,等等。可以使用以下R代码生成此表并进行McNemar测试。
mat = as.table(rbind(c(1000, 40), c( 200, 60) ))
colnames(mat) <- rownames(mat) <- c("Nonsmoker", "Smoker")
names(dimnames(mat)) = c("Cancer", "Normal")
mat
# Normal
# Nonsmoker Smoker
# Cancer
# Nonsmoker 1000 40
# Smoker 200 60
mcnemar.test(mat)
# McNemar's Chi-squared test with continuity correction
#
#data: mat
#McNemar's chi-squared = 105.34, df = 1, p-value < 2.2e-16
McNemar的检验还用于评估干预对二元结果变量的影响。如上所述对一对前后结果进行测试。
编辑:扩展@gung给出的示例,如果吸烟状态在数据框mydf中列出,如下所示:
pairID cancer control
1 1 1
2 1 1
3 1 0
...
可以使用以下R命令完成McNemars测试:
> tt = with(mydf, table(cancer, control))
> tt
control
cancer 0 1
0 5 1
1 3 2
> mcnemar.test(tt)
McNemar`s Chi-squared test with continuity correction
data: tt
McNemar`s chi-squared = 0.25, df = 1, p-value = 0.6171
您认为Fisher的精确测试不适合您的数据是正确的。您将不得不重新形成您的列联表。新表将用于pairs,因此它将显示一半的数据(在您的情况下为40而不是80)。例如,假设您的数据看起来像这样(每对配对的主题在其自己的行中,并1
指示吸烟者):
cancer control
1 1
1 1
1 0
1 0
1 0
0 1
0 0
0 0
0 0
0 0
0 0
那么您的旧列联表可能是:
cancer control
smoker 5 3
non 6 8
您的新列联表将如下所示:
control
cancer smoker non
smoker 2 3
non 1 5
第一个列联表总计22(您的研究中的总科目数),但是第二个列联表总计11(匹配的对数)。
以这种方式表示数据时,您感兴趣的是边际比例是否相同。那个测试就是麦克尼马尔的测试。我已经在这里和这里解释了麦克尼马尔的测验。