我有一组数据如下:
A B C D
1 2 3 4
2 3 4 5
它们是 ABCD 构成 2x2 表的聚合数据,我需要对每一行进行 Fisher 精确检验,并为该行的 Fisher 精确检验的 p 值添加一个新列。
我可以在 R 中使用fisher.exact
和循环来执行此操作,但我在 Stata 中找不到用于 Fisher 精确测试的命令。
我有一组数据如下:
A B C D
1 2 3 4
2 3 4 5
它们是 ABCD 构成 2x2 表的聚合数据,我需要对每一行进行 Fisher 精确检验,并为该行的 Fisher 精确检验的 p 值添加一个新列。
我可以在 R 中使用fisher.exact
和循环来执行此操作,但我在 Stata 中找不到用于 Fisher 精确测试的命令。
您正在用 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,斯塔斯
查看cci
带有exact
选项的命令:
cci 10 15 30 10, exact
它是所谓的“立即”命令的一部分。它们允许您直接从参数而不是从存储在内存中的数据进行计算。看一下help immediate
海报原始问题中的每个观察结果显然都包含一张传统 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
请注意,给局部宏赋予与变量相同的名称是没有问题的。