1

我有一些调查数据,我正在使用 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文件或组,如果我能弄清楚如何通过处理来使用。

4

2 回答 2

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
于 2013-10-27T04:05:23.433 回答
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
于 2013-10-26T02:24:45.427 回答