我有一组如下数据:
A B C D
1 2 3 4
2 3 4 5
它们是聚合数据,ABCD构成2x2表,我需要对每一行进行Fisher精确检验,并为该行的Fisher精确检验的p值添加一个新列。
我可以使用fisher.exact
并循环在R中执行此操作,但我无法在Stata中找到Fisher精确测试的命令。
答案 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的代码适用于个人观察的数据。尼克指出-cci-可以分析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
请注意,为本地宏提供与变量相同的名称没有问题。