for-loop - Stata中的无效语法循环
问题描述
我正在尝试运行 for 循环以在 Stata 中制作平衡表(将我的数据集的人口统计数据与国家级统计数据进行比较)
为此,我正在准备我的数据集并尝试计算一些关键人口统计数据的百分比/平均值。
preserve
rename unearnedinc_wins95 unearninc_wins95
foreach var of varlist fem age nonwhite hhsize parent employed savings_wins95 debt_wins95 earnedinc_wins95 unearninc_wins95 underfpl2019 { //continuous or binary; to put categorical vars use kwallis test
dis "for variable `var':"
tabstat `var'
summ `var'
local `var'_samplemean=r(mean)
}
clear
set obs 11
gen var=""
gen sample=.
gen F=.
gen pvalue=.
replace var="% Female" if _n==1
replace var="Age" if _n==2
replace var="% Non-white" if _n==3
replace var="HH size" if _n==4
replace var="% Parent" if _n==5
replace var="% Employed" if _n==6
replace var="Savings stock ($)" if _n==7
replace var="Debt stock ($)" if _n==8
replace var="Earned income last mo. ($)" if _n==9
replace var="Unearned income last mo. ($)" if _n==10
replace var="% Under FPL 2019" if _n==11
foreach col of varlist sample {
replace `col'=100*round(`fem_`col'mean', 0.01) if _n==1
replace `col'=round(`age_`col'mean') if _n==2
replace `col'=100*round(`nonwhite_`col'mean', 0.01) if _n==3
replace `col'=round(`hhsize_`col'mean', 0.1) if _n==4
replace `col'=100*round(`parent_`col'mean', 0.01) if _n==5
replace `col'=100*round(`employed_`col'mean', 0.01) if _n==6
replace `col'=round(`savings_wins95_`col'mean') if _n==7
replace `col'=round(`debt_wins95_`col'mean') if _n==8
replace `col'=round(`earnedinc_wins95_`col'mean') if _n==9
replace `col'=round(`unearninc_wins95_`col'mean') if _n==10
replace `col'=100*round(`underfpl2019_`col'mean', 0.01) if _n==11
}
我正在尝试运行以下循环,但在循环的后半部分,我不断收到“无效语法”错误。对于上下文,在循环的前半部分(清除数据集之前),代码将变量的平均值存储为宏(`var'_samplemean)。有人可以帮我解决这个循环吗?
我的样本数据:
clear
input byte fem float(age nonwhite) byte(hhsize parent) float employed double(savings_wins95 debt_wins95 earnedinc_wins95 unearninc_wins95) float underfpl2019
1 35 1 6 1 1 0 2500 0 0 0
0 40 0 4 1 1 0 10000 1043 0 0
0 40 0 4 1 1 0 20000 2400 0 0
0 40 0 4 1 1 .24 20000 2000 0 0
0 40 0 4 1 1 10 . 2600 0 0
谢谢!
解决方案
这并不能直接回答您的问题;正如其他人温和指出的那样,如果没有可重复的例子,这个问题很难回答。但是我对您的代码有几条小评论,以这种形式更好地呈现。
假设所有需要的变量确实存在于数据集中,我会推荐更像这样的东西:
local myvarlist fem age nonwhite hhsize parent employed savings_wins95 debt_wins95 earnedinc_wins95 unearninc_wins95 underfpl2019
local desc `" "% Female" "Age" "% Non-white" "HH size" "% Parent" "% Employed" "Savings stock ($)" "Debt stock ($)" "Earned income last mo. ($)" "Unearned income last mo. ($)" "% Under FPL 2019" "'
local i = 1
gen variable = ""
gen mean = ""
local i = 1
foreach var of local myvars {
summ `var', meanonly
local this : word `i' of `desc'
replace variable = "`this'" in `i'
if inlist(`i', 1, 3, 5, 6, 11) {
replace mean = strofreal(100 * r(mean), "%2.0f") in `i'
}
else if `i' == 4 {
replace mean = strofreal(r(mean), "%2.1f") in `i'
}
else replace mean = strofreal(r(mean), "%2.0f") in `i'
local ++i
}
这尚未经过测试。
出现的要点包括:
in
对于您想要的结果,最好使用if
.round()
四舍五入到这么多小数位是危险的。大多数时候你会得到你想要的,但偶尔你会得到奇怪的结果,因为 Stata 在二进制中工作,就像任何等效的程序一样。将舍入视为字符串操作中的问题并使用显示格式精确提供您想要的内容会更安全。如果您要显示的文本只是每个变量的变量标签,则可以进一步简化此代码。
该代码暗示了显示其他内容的意图,这很容易与此设计兼容。
推荐阅读
- python - 如何在 subplot2grid 中保持子图比例的同时调整绘图大小?
- json - 如何用jq递归转换json树?
- r - 如何通过重绘图表来制作简单的“动画”
- javascript - react 和 jquery ajax 中的异步问题
- c++ - 如何使我的代码语句以 clang 格式出现在一行中?
- hosting - 主机考勤系统
- python - 如何使用图形 API 在 azure 广告中更新访客用户的密码。?Python
- jwt - 是否建议增加对刷新令牌的保护以散列它们而不是将它们保存到数据库中?
- android - 为什么我的 java 文件在 android studio 上以编码格式打开
- c# - 获取目录路径