Stata:将标量(例如测试统计数据)收集到一个对象中
Stata: collect scalars (eg test statistics) into one object
这应该很容易,但我找不到好的答案:
我想收集一些标量,例如几个变量的均值(或回归输出,或测试统计,或 p 值),到一个对象中用于绘图或作为变量等。
考虑这样一个数据集:
clear
input str3 iso3 var1 var2 var3
GBR 10 13 12
USA 9 7 4
FRA 8 8 7
end
假设我从一个循环中得到了我想要收集的标量:
foreach i in var1 var2 var3{
mean `i'
matrix A= r(table)
scalar s_`i'= A[1,1]
}
现在我可以 display s_var1
例如,但是我如何获得一个对象,它只是给我 [9, 9.3333, 7.6666]
用于绘图或作为变量?理想情况下不会丢失原始数据集?当然,我的实际数据集不是 3x3,而是更长。
编辑: 在评论中澄清后,最直接的答案是在 Robertos 编辑中。 Ander2ed 的回答给出了直接对问题进行编程的直觉。
设置数据以创建图表最终取决于数据集的结构、所需的计算、(可能)数据集的大小以及图表的类型。
一个荒谬的例子:
clear
input str3 iso3 var1 var2 var3
GBR 10 13 12
USA 9 7 4
FRA 8 8 7
end
preserve
collapse var*
gen i = _n
reshape long var, i(i)
graph twoway line var _j
restore
collapse
这里是一些计算的例子,但它可以是任何东西。我使用 preserve
和 restore
轻松返回到原始数据。这可能是也可能不是最好的方法,但正如我之前提到的,这实际上取决于手头的问题。
编辑
针对您的评论,您可能想要 postfile
。一个例子(大部分来自手册):
clear
set more off
*----- example data -----
input str3 iso3 var1 var2 var3
GBR 10 13 12
USA 9 7 4
FRA 8 8 7
end
*----- what you want -----
tempfile results
tempname sim
postfile `sim' mean var using `results', replace
quietly {
foreach v of varlist var? {
summarize `v'
post `sim' (r(mean)) (r(Var))
}
}
postclose `sim'
list // original ok
use `results', clear
list // results to graph
postfile
非常灵活。只需阅读手册条目并进行实验。
除了@Roberto 的回答所建议的 collapse
之外,我还经常使用 Stata 的 matrix
语言,尤其是 svmat
来完成类似的任务。我认为这是一个偏好问题(尽管 collapse
可能更直接)所以我认为值得在一个单独的、荒谬的例子中提及:
clear *
input str3 iso3 var1 var2 var3
GBR 10 13 12
USA 9 7 4
FRA 8 8 7
end
mean var1 - var3
mat A = (r(table))'
preserve
clear
svmat A, names(matcol)
rename A* *
// Build Plots Here
twoway scatter t pvalue, name(plot1)
restore
graph display plot1
这应该很容易,但我找不到好的答案:
我想收集一些标量,例如几个变量的均值(或回归输出,或测试统计,或 p 值),到一个对象中用于绘图或作为变量等。
考虑这样一个数据集:
clear
input str3 iso3 var1 var2 var3
GBR 10 13 12
USA 9 7 4
FRA 8 8 7
end
假设我从一个循环中得到了我想要收集的标量:
foreach i in var1 var2 var3{
mean `i'
matrix A= r(table)
scalar s_`i'= A[1,1]
}
现在我可以 display s_var1
例如,但是我如何获得一个对象,它只是给我 [9, 9.3333, 7.6666]
用于绘图或作为变量?理想情况下不会丢失原始数据集?当然,我的实际数据集不是 3x3,而是更长。
编辑: 在评论中澄清后,最直接的答案是在 Robertos 编辑中。 Ander2ed 的回答给出了直接对问题进行编程的直觉。
设置数据以创建图表最终取决于数据集的结构、所需的计算、(可能)数据集的大小以及图表的类型。
一个荒谬的例子:
clear
input str3 iso3 var1 var2 var3
GBR 10 13 12
USA 9 7 4
FRA 8 8 7
end
preserve
collapse var*
gen i = _n
reshape long var, i(i)
graph twoway line var _j
restore
collapse
这里是一些计算的例子,但它可以是任何东西。我使用 preserve
和 restore
轻松返回到原始数据。这可能是也可能不是最好的方法,但正如我之前提到的,这实际上取决于手头的问题。
编辑
针对您的评论,您可能想要 postfile
。一个例子(大部分来自手册):
clear
set more off
*----- example data -----
input str3 iso3 var1 var2 var3
GBR 10 13 12
USA 9 7 4
FRA 8 8 7
end
*----- what you want -----
tempfile results
tempname sim
postfile `sim' mean var using `results', replace
quietly {
foreach v of varlist var? {
summarize `v'
post `sim' (r(mean)) (r(Var))
}
}
postclose `sim'
list // original ok
use `results', clear
list // results to graph
postfile
非常灵活。只需阅读手册条目并进行实验。
除了@Roberto 的回答所建议的 collapse
之外,我还经常使用 Stata 的 matrix
语言,尤其是 svmat
来完成类似的任务。我认为这是一个偏好问题(尽管 collapse
可能更直接)所以我认为值得在一个单独的、荒谬的例子中提及:
clear *
input str3 iso3 var1 var2 var3
GBR 10 13 12
USA 9 7 4
FRA 8 8 7
end
mean var1 - var3
mat A = (r(table))'
preserve
clear
svmat A, names(matcol)
rename A* *
// Build Plots Here
twoway scatter t pvalue, name(plot1)
restore
graph display plot1