我正在尝试根据其他变量的数学表达式在我的数据中为每年创建一个变量(我有年度数据并使用"..."以避免每年写作)。我正在使用 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')
}
}
}
让我们专注于问题所在。您希望sex
、race
和year
的所有组合的标准差为 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
在这里考虑作为一个更简单的直接替代方案。