我有一些调查数据,我正在使用Stata进行分析。我想按组计算一个变量的均值,并将这些方法保存到Stata文件中。我的代码如下所示:
svyset [iw=wtsupp], sdrweight(repwtp1-repwtp160) vce(sdr)
svy: mean x
我试过
svy: by grp: mean x
但这不起作用。我可以通过简单地说
将每个均值保存到单独的文件中svy: mean x if grp==1
但效率低下。还有更好的方法吗?
将结果保存到文件,例如可以使用SAS ODS捕获结果也是一种需要。我不是在谈论这里的日志。我需要手段和相关组。我在想
estimates save [path],replace
但是我不确定如果我能通过处理找出如何使用,那么它是否会给我一个Stata文件或组。
答案 0 :(得分:2)
已编辑10/28
此版本包含易读性改进,结果变量和已保存的数据集在本地宏中指定。因此,分析师无需触及foreach
块。使用更容易编写和读取矩阵下标表达式而不是el
矩阵函数:因此m[1,1]
而不是el("m",1,1)
。
sysuse auto, clear
svyset _n
************************************************ *
* Set names of grouping variable and results data *
* set in double quotes in the next line. *
* ************************************************
local yvar mpg // variable for mean
local gpname "foreign"
local d_results "results"
tempvar gp
gen `gp' = `gpname'
tempname memhold
postfile `memhold' ///
`gpname' n mean se sd using `d_results', replace
levelsof `gp', local(lg)
foreach x of local lg{
svy, subpop(if `gp'==`x'): mean `yvar'
matrix m = e(b)
matrix v = e(V)
matrix a = e(V_srssub)
matrix b = e(_N_subp)
matrix c = e(_N)
scalar gx = `x'
scalar mean = m[1,1]
scalar sem = sqrt(v[1,1])
scalar sd = sqrt(b[1,1]*a[1,1])
scalar n = c[1,1]
post `memhold' (gx) (n) (mean) (sem) (sd)
}
postclose `memhold'
use results, clear
list
答案 1 :(得分:2)
这是一种更简单的方法,可以创建显示的估算结果的数据集:估算平均值,标准误差,置信限,z统计量和p值。使用svy: mean
选项调用over()
,这样就不需要foreach
循环,并计算适合子群体分析的标准错误。估计结果包含在返回的矩阵r(table)
中,该矩阵由svmat
命令转换为Stata数据集。虽然svmat
维护列名称,但它不保留行(组)名称,因此必须merge
将这些名称保存到创建的数据集中。
set more off
use http://www.stata-press.com/data/r13/ss07ptx, clear
svyset _n [pw= pwgtp], sdrweight(pwgtp*) vce(sdr)
************************************************ *
* Set name of grouping variable in double quotes *
* in the next line. *
* ************************************************
local gpname "sex"
tempvar gp
egen `gp' = group(`gpname')
preserve
tempfile t1
bys `gp': keep if _n==1
keep `gp' `gpname'
save `t1'
restore
svy: mean agep , over(`gp')
matrix a = r(table)'
clear
qui svmat double a, names(col)
gen `gp'=_n
merge 1:1 `gp' using `t1'
keep `gpname' b se z pvalue ll ul
order `gpname'
save results, replace
list