使用Stata对聚集数据执行Fisher精确测试

使用Stata对聚集数据执行Fisher精确测试,stata,Stata,我有一组如下数据: A B C D 1 2 3 4 2 3 4 5 它们是聚合数据,ABCD构成了一个2x2表,我需要对每一行进行Fisher精确测试,并为该行的Fisher精确测试的p值添加一个新列 我可以使用fisher.exact和循环在R中执行此操作,但我在Stata中找不到fisher-exact测试的命令。查看带有exact选项的cci命令: cci 10 15 30 10, exact 它是所谓“立即”命令的一部分。它们允许您直接从参数而不是从存储在内存中的数据进行计算。查看h

我有一组如下数据:

A B C D
1 2 3 4
2 3 4 5
它们是聚合数据,ABCD构成了一个2x2表,我需要对每一行进行Fisher精确测试,并为该行的Fisher精确测试的p值添加一个新列


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

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

cci 10 15 30 10, exact

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

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

cci 10 15 30 10, exact

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

你是用R术语思考的,而这在Stata中通常是徒劳的(就像Stata的人不可能通过…:在R中回归
;每个包都有自己的范例和优势)

没有可向其中添加列的对象。也许你可以多说一点关于你需要做什么,最终,用你的p值,以便找到一个合适的解决方案,你的Stata合作者会同情

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

    clear
    input x y f1 f2
    0 0 5 10
    0 1 7 12
    1 0 3 8
    1 1 9 5
    end
我假设你的
abcd
代表两个二进制变量,数字是数据中的频率。您必须
清除
内存,因为Stata一次只考虑一个数据集

然后,您可以将结果
制成表格,并
生成包含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]
是一种指定频率权重的方法;我键入了
返回列表
,以了解Stata作为过程的结果存储了什么样的信息这就是Stata使用的类似对象的东西。R将在
fisher.test()$p.value
组件中返回测试结果,Stata将创建返回值,
R(组件)
用于简单命令,
e(组件)
用于估算命令

如果需要循环解决方案(如果有多个集合),可以执行以下操作:

   forvalues k=1/2 {
    tabulate x y [fw=f`k'], exact
    generate p`k' = r(p_exact)
   }
这就是Stata、IMHO比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,Stas

你在用R的术语思考,而这在Stata中通常是徒劳的(就像Stata的人不可能通过…:R中的回归
;每个包都有自己的范例和优势)

没有可向其中添加列的对象。也许你可以多说一点关于你需要做什么,最终,用你的p值,以便找到一个合适的解决方案,你的Stata合作者会同情

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

    clear
    input x y f1 f2
    0 0 5 10
    0 1 7 12
    1 0 3 8
    1 1 9 5
    end
我假设你的
abcd
代表两个二进制变量,数字是数据中的频率。您必须
清除
内存,因为Stata一次只考虑一个数据集

然后,您可以将结果
制成表格,并
生成包含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]
是一种指定频率权重的方法;我键入了
返回列表
,以了解Stata作为过程的结果存储了什么样的信息这就是Stata使用的类似对象的东西。R将在
fisher.test()$p.value
组件中返回测试结果,Stata将创建返回值,
R(组件)
用于简单命令,
e(组件)
用于估算命令

如果需要循环解决方案(如果有多个集合),可以执行以下操作:

   forvalues k=1/2 {
    tabulate x y [fw=f`k'], exact
    generate p`k' = r(p_exact)
   }
这就是Stata、IMHO比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,Stas

海报原始问题中的每个观察结果显然包括一个传统的2 x 2表格中的四个计数。Stas的代码适用于个人观测数据。Nick指出-cci-可以分析b c d数据。下面的代码将-cci应用于每个表,并与Stas的代码一样,将p值添加到数据集中。
forvalues i=1/`=\N'
语句告诉Stata从第一次观察到最后一次观察运行循环<代码>a[`i']