使用Stata进行聚合进行Fisher精确检验

时间:2011-08-04 08:56:16

标签: stata

我有一组如下数据:

A B C D
1 2 3 4
2 3 4 5

它们是聚合数据,ABCD构成2x2表,我需要对每一行进行Fisher精确检验,并为该行的Fisher精确检验的p值添加一个新列。

我可以使用fisher.exact并循环在R中执行此操作,但我无法在Stata中找到Fisher精确测试的命令。

3 个答案:

答案 0 :(得分:3)

你正在用R语言思考,这在Stata中通常是徒劳的(正如Stata家伙不可能在R中弄清楚如何做by ... : regress;每个包都有自己的范例和它自己的范例强度)。

没有要添加列的对象。也许你可以用你的p值更多地说明你需要做什么,以便找到你的Stata合作者会同情的合适解决方案。

如果您确实要添加新列(generate一个新变量,说Stata),那么您可能需要查看tabulate及其返回值:

    clear
    input x y f1 f2
    0 0 5 10
    0 1 7 12
    1 0 3 8
    1 1 9 5
    end

我假设您的A B C D代表两个二进制变量,数字是数据中的频率。你必须clear内存,因为Stata一次只考虑一个数据集。

然后你可以tabulate结果和generate包含p值的新变量,尽管创建包含常量值的变量会浪费大量内存:

    tabulate x y [fw=f1], exact
    return list
    generate p1 = r(p_exact)
    tabulate x y [fw=f2], exact
    generate p2 = r(p_exact)

此处,[fw=variable]是一种指定频率权重的方法;我键入return list以找出Stata存储的过程结果的信息类型。 那是与Stata合作的类似对象的东西。 R将在fisher.test()$p.value组件中返回测试结果,Stata为简单命令创建返回值r(component),为估计命令创建e(component)

如果你想要一个循环解决方案(如果你有很多套),你可以这样做:

   forvalues k=1/2 {
    tabulate x y [fw=f`k'], exact
    generate p`k' = r(p_exact)
   }

这就是Stata,恕我直言,比R更强的脚本能力(虽然可以说这是一个非常糟糕的编程技巧)。本地宏k取值从1到2,并且这个宏在代码卷括号中的任何地方都被替换为“k”。

或者,您可以将结果作为标量保存在Stata短期记忆中:

    tabulate x y [fw=f1], exact
    scalar p1 = r(p_exact)
    tabulate x y [fw=f2], exact
    scalar p2 = r(p_exact)

但是,标量与数据集没有关联,所以你不能用它们保存它们 数据

cci建议的here等即时命令也会返回您可以类似检索的值。

HTH,Stas

答案 1 :(得分:2)

使用cci选项查看exact命令:

cci 10 15 30 10, exact

这是所谓的“立即”命令的一部分。它们允许您直接从参数进行计算,而不是从存储在内存中的数据进行计算。看看help immediate

答案 2 :(得分:0)

海报原始问题中的每个观察结果显然包括一个传统的2 x 2表中的四个计数。 Stas的代码适用于个人观察的数据。尼克指出-c​​ci-可以分析b数据。这里的代码将-cci应用于每个表,并且像Stas的代码一样,将p值添加到数据集中。 forvalues i = 1/`=_N'语句告诉Stata从第一个到最后一个观察点运行循环。 a[`i']指的是第i次观测中变量“a”的值。

    clear
    input a b c d
    10 2 8 4
    5 8 2 1
    end

    gen exactp1 = .
    gen exactp2 =.
    label var exactp1 "1-sided exact p"
    label var exactp2 "2-sided exact p"
    forvalues i = 1/`=_N'{
      local a = a[`i']
      local b = b[`i']
      local c = c[`i']
      local d = d[`i']
      qui cci `a' `b' `c' `d', exact
      replace exactp1 = r(p1_exact) in `i'
      replace exactp2 = r(p_exact) in `i'
      }
    list

请注意,为本地宏提供与变量相同的名称没有问题。