调查中的Stata输出文件

时间:2013-10-25 17:47:49

标签: stata survey

我有一些调查数据,我正在使用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文件或组。

2 个答案:

答案 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