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

汇总Stata中的变量并提取标准差,stata,Stata,我试图在我的数据中根据我有年度数据和使用的其他变量的数学表达式为每年创建一个变量。。。避免每年写作。我正在使用Stata中的SUMMATE命令提取标准偏差,但Stata无法识别frac变量。我曾尝试使用egen,但这会导致未知函数错误。使用gen会产生一个已定义的变量。我将非常感谢任何人帮助我编写以下代码,或者给我指出讨论过这个问题的链接 foreach yr of numlist 1995...2012 { local row = `yr' - 1994

我试图在我的数据中根据我有年度数据和使用的其他变量的数学表达式为每年创建一个变量。。。避免每年写作。我正在使用Stata中的SUMMATE命令提取标准偏差,但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

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

这段代码通过@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

如后面的答案一样,将崩溃看作是一个更简单的直接选择。 在评论中,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') 
        } 
    } 
}
让我们关注问题是什么。您希望将性别、种族和年份的所有组合的frac标准偏差保存在单独的文件中。那是一条线

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

如果您想在数据旁边看到表,请考虑

egen group = group(sex race year), label 
然后

tab group, su(frac) 


谢谢你的建议。这在我看来很直观,但当程序进入循环时,它导致了无效的语法错误。我不清楚问题出在哪里。您是对的,我正在尝试生成一个结果,显示每年计数的年份或某行值以及frac变量的标准偏差。在我的原始代码中,我想查看组件以及分子和分母,以确保代码生成的是我手工编写的结果。SUMMARE语句中的Need==not=。@Nick Cox感谢您指出这一点。它修复了问题并生成了结果:对此表示抱歉。如果我有数据的话,我可以纠正这个错误。是的,应该是year=='yr.@Nick Cox@Pcarlitz你对如何按分组,特别是按种族和性别,每年产生结果有什么建议吗?我修改了下面您推荐的代码,但我收到语法错误,但不知道错误出现的位置/原因。postfile memhold'year sdfrac sex race using myresults levels of sex,local s levels of race,local r foreach a of local s{forval yr=1995/2012{总结frac if year==yr'&sex==a'&race==b'post memhold'yr'rsd'sex''race'}再次感谢您的帮助和耐心。是的,我确实想保存这些结果,您的代码会有所帮助。Summary将应用于某些变量,或者根本不应用。将其应用于具有数值的局部变量。
tabstat frac, by(group) stat(sd)