在 Stata 中汇总变量并提取标准偏差

  • 本文关键字:提取 标准 变量 Stata stata
  • 更新时间 :
  • 英文 :


我正在尝试根据其他变量的数学表达式在我的数据中为每年创建一个变量(我有年度数据并使用"..."以避免每年写作)。我正在使用 Stata 中的 summary 命令来提取标准偏差,但 Stata 无法识别frac变量。我尝试使用egen但会导致未知函数错误。使用gen会产生已定义的变量。我将不胜感激任何帮助以下代码或将我指向已讨论此问题的链接的人。

    foreach yr of numlist 1995...2012 {
            local row = `yr' - 1994
            local numerator = 100*(income - L1.income)
            local denominator = ((abs(income) + abs(L1.income)) / 2)
            local frac = (`numerator' / `denominator') 
            summarize frac
            local sdfrac = r(sd)
            matrix C[`row', 1] = `numerator'
            matrix C[`row', 2] = `denominator'
            matrix C[`row', 3] = `sdfrac'
        }

如果我理解你的问题是正确的,也许你不需要在最后使用循环,然后你可以将结果发布到postfile:

这只是一个想法:

tempname memhold
tempfile filename
postfile `memhold' year sdfrac using `filename'
gen row=year-1994
gen numerator=100*(income-L1.income)
gen denominator=((abs(income)+abs(L1.income))/2)
gen frac=numerator/denominator
foreach yr of numlist 1995...2012 {
summarize frac if year=`yr'
local sdfrac=r(sd)
post `memhold' (year) (`sdfrac')
}
postclose `memhold'
clear all 
use `filename'
*View Results
list

此代码应该为您提供一个数据集,其中包含年份名称和压裂变量的标准偏差作为变量。

在评论中,OP 添加了一个关于类似代码的问题(但忽略了以更文明的形式发布它的请求)。请注意,Stata 中的反引号或左引号与注释中的 SO 标记代码冲突。大概是一些

tempname memhold 

定义先于此。

postfile `memhold' year sdfrac sex race using myresults     
levels of sex, local (s)     
levelsof race, local (r)     
foreach a of local s {     
    foreach b of local r {     
        forval yr = 1995/2012 {     
           summarize frac if year == `yr' & sex == `a' & race == `b' 
           post `memhold' (`yr') (`r(sd)') (`sex') (`race') 
        } 
    } 
}

让我们专注于问题所在。您希望sexraceyear的所有组合的标准差为 frac 在一个单独的文件中。那是一行

collapse (sd) frac, by(year sex race) 

如果要在数据旁边查看表,请考虑

egen group = group(sex race year), label 

然后

tab group, su(frac) 

tabstat frac, by(group) stat(sd)

此代码通过@Pcarlitz对其进行修改,主要是通过简化它。我无法检查您的数据,我没有。

它太长了,无法放入评论中。

我似乎不会使用临时文件,因为您想保存这些结果。

tempname memhold
postfile `memhold' year sdfrac using myresults
gen frac = (100*(income - L1.income))/((abs(income) + abs(L1.income))/2)
forval yr = 1995/2012 {
    summarize frac if year==`yr'
    post `memhold' (`yr') (`r(sd)')
}
postclose `memhold'
use myresults 
list

更新 与后面的答案一样,collapse在这里考虑作为一个更简单的直接替代方案。

最新更新