0

我有一组数据如下:

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

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

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

4

3 回答 3

3

您正在用 R 术语思考,而这在 Stata 中通常是徒劳的(就像 Stata 人不可能弄清楚如何by ... : regress在 R 中做事一样;每个包都有自己的范式和自己的优势)。

没有要添加列的对象。也许你可以多说一点你需要做什么,最终,用你的 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 一次只考虑一个数据集。

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

    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组件中返回测试结果,Statar(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建议的直接命令也将返回您可以类似检索的值。

HTH,斯塔斯

于 2011-08-04T16:15:48.603 回答
2

查看cci带有exact选项的命令:

cci 10 15 30 10, exact

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

于 2011-08-04T10:33:06.733 回答
0

海报原始问题中的每个观察结果显然都包含一张传统 2 x 2 表格中的四个计数。Stas 的代码适用于个人观察数据。Nick 指出 -cci- 可以分析 abcd 数据。这是将 -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

请注意,给局部宏赋予与变量相同的名称是没有问题的。

于 2013-10-04T18:35:35.877 回答