Stata:如何批量提取多层混合效应线性回归结果的估计值、标准差等统计量

最近有个小伙伴问到了关于如何批量提取多层混合效应线性回归结果的估计值、标准差等统计量。今天的课程中我们将通过一个小案例来讲解处理这类问题的两种方法。

方法一:编程从返回值中提取

productivity.dta 是附件中提供的一个 dta 文件。例如拟合一个三水平的嵌套模型,其中观测值嵌套在州内,州嵌套在地区内,方法选择 MLE:

use productivity, clear
*> (Public capital productivity)
mixed gsp private emp hwy water other unemp || region: || state:, mle
*> Performing EM optimization ...
*> Performing gradient-based optimization:
*> Iteration 0: log likelihood = 1430.5017
*> Iteration 1: log likelihood = 1430.5017
*> Computing standard errors ...
*> Mixed-effects ML regression Number of obs = 816
*> Grouping information
*> -------------------------------------------------------------
*> | No. of Observations per group
*> Group variable | groups Minimum Average Maximum
*> ----------------+--------------------------------------------
*> region | 9 51 90.7 136
*> state | 48 17 17.0 17
*> -------------------------------------------------------------
*> Wald chi2(6) = 18829.06
*> Log likelihood = 1430.5017 Prob > chi2 = 0.0000
*> ------------------------------------------------------------------------------
*> gsp | Coefficient Std. err. z P>|z| [95% conf. interval]
*> -------------+----------------------------------------------------------------
*> private | .2671484 .0212591 12.57 0.000 .2254814 .3088154
*> emp | .754072 .0261868 28.80 0.000 .7027468 .8053973
*> hwy | .0709767 .023041 3.08 0.002 .0258172 .1161363
*> water | .0761187 .0139248 5.47 0.000 .0488266 .1034109
*> other | -.0999955 .0169366 -5.90 0.000 -.1331906 -.0668004
*> unemp | -.0058983 .0009031 -6.53 0.000 -.0076684 -.0041282
*> _cons | 2.128823 .1543854 13.79 0.000 1.826233 2.431413
*> ------------------------------------------------------------------------------
*> ------------------------------------------------------------------------------
*> Random-effects parameters | Estimate Std. err. [95% conf. interval]
*> -----------------------------+------------------------------------------------
*> region: Identity |
*> var(_cons) | .0014506 .0012995 .0002506 .0083957
*> -----------------------------+------------------------------------------------
*> state: Identity |
*> var(_cons) | .0062757 .0014871 .0039442 .0099855
*> -----------------------------+------------------------------------------------
*> var(Residual) | .0013461 .0000689 .0012176 .0014882
*> ------------------------------------------------------------------------------
*> LR test vs. linear model: chi2(2) = 1154.73 Prob > chi2 = 0.0000
*> Note: LR test is conservative and provided only for reference.

再计算残差组内相关性:

estat icc
*> Residual intraclass correlation
*> ------------------------------------------------------------------------------
*> Level | ICC Std. err. [95% conf. interval]
*> -----------------------------+------------------------------------------------
*> region | .159893 .127627 .0287143 .5506202
*> state|region | .8516265 .0301733 .7823466 .9016272
*> ------------------------------------------------------------------------------

对于一个模型,我们很容易手动复制粘贴把模型的结果整理出来,但是如果是一堆模型呢:

  • mixed gsp || region: || state:, mle
  • mixed private || region: || state:, mle
  • mixed emp || region: || state:, mle
  • …….

首先我们研究下第一个模型:

mixed gsp || region: || state:, mle
*> Performing EM optimization ...
*> Performing gradient-based optimization:
*> Iteration 0: log likelihood = 200.86162
*> Iteration 1: log likelihood = 200.86162
*> Computing standard errors ...
*> Mixed-effects ML regression Number of obs = 816
*> Grouping information
*> -------------------------------------------------------------
*> | No. of Observations per group
*> Group variable | groups Minimum Average Maximum
*> ----------------+--------------------------------------------
*> region | 9 51 90.7 136
*> state | 48 17 17.0 17
*> -------------------------------------------------------------
*> Wald chi2(0) = .
*> Log likelihood = 200.86162 Prob > chi2 = .
*> ------------------------------------------------------------------------------
*> gsp | Coefficient Std. err. z P>|z| [95% conf. interval]
*> -------------+----------------------------------------------------------------
*> _cons | 10.65961 .2503806 42.57 0.000 10.16887 11.15035
*> ------------------------------------------------------------------------------
*> ------------------------------------------------------------------------------
*> Random-effects parameters | Estimate Std. err. [95% conf. interval]
*> -----------------------------+------------------------------------------------
*> region: Identity |
*> var(_cons) | .4376123 .2697616 .1307299 1.464887
*> -----------------------------+------------------------------------------------
*> state: Identity |
*> var(_cons) | .6080626 .138273 .3893907 .949535
*> -----------------------------+------------------------------------------------
*> var(Residual) | .0246633 .0012586 .0223159 .0272577
*> ------------------------------------------------------------------------------
*> LR test vs. linear model: chi2(2) = 2750.56 Prob > chi2 = 0.0000
*> Note: LR test is conservative and provided only for reference.

查看 e 类返回值和 r 类返回值:

eret list
*> scalars:
*> e(rank) = 4
*> e(k_f) = 1
*> e(k_r) = 3
*> e(k) = 4
*> e(k_rs) = 3
*> e(k_rc) = 0
*> e(k_res) = 0
*> e(converged) = 1
*> e(ic) = 1
*> e(ll) = 200.8616220990124
*> e(ll_c) = -1174.417469043522
*> e(df_c) = 2
*> e(chi2_c) = 2750.558182285069
*> e(p_c) = 0
*> e(N) = 816
*> e(nrgroups) = 1
*> e(small) = 0
*> e(df_m) = 0
*> e(p) = .
*> e(chi2) = .
*> e(rc) = 0
*> macros:
*> e(cmdline) : "mixed gsp || region: || state:, mle"
*> e(datasignaturevars) : "gsp region state"
*> e(datasignature) : "816:3:2680577562:2416594293"
*> e(chi2type) : "Wald"
*> e(rstructlab) : "Independent"
*> e(rstructure) : "independent"
*> e(estat_cmd) : "mixed_estat"
*> e(predict) : "mixed_p"
*> e(redim) : "1 1"
*> e(ivars) : "region state"
*> e(vartypes) : "Identity Identity"
*> e(revars) : "_cons _cons"
*> e(cmd) : "mixed"
*> e(title) : "Mixed-effects ML regression"
*> e(technique) : "nr"
*> e(ml_method) : "d0"
*> e(opt) : "moptimize"
*> e(method) : "ML"
*> e(optmetric) : "matsqrt"
*> e(depvar) : "gsp"
*> e(properties) : "b V"
*> matrices:
*> e(b) : 1 x 4
*> e(V) : 4 x 4
*> e(g_max) : 1 x 2
*> e(g_avg) : 1 x 2
*> e(g_min) : 1 x 2
*> e(N_g) : 1 x 2
*> functions:
*> e(sample)
ret list
*> macros:
*> r(name) : "<unnamed>"
*> r(type) : "text"
*> r(status) : "on"
*> r(filename) : "/Users/ac/Desktop/Stata:如何批量提取多层混合效应线性回归结果的估计值、标准差等统计量/logfile_blocks/tempsmddoclog4.log"
mat a = r(table)
mat list a
*> symmetric a[1,1]
*> c1
*> r1 .

可以看到 a 里面存储了所有的回归系数和随机效应参数。

再看 icc 的:

estat icc
*> Intraclass correlation
*> ------------------------------------------------------------------------------
*> Level | ICC Std. err. [95% conf. interval]
*> -----------------------------+------------------------------------------------
*> region | .4088542 .1636402 .1550255 .7227831
*> state|region | .9769574 .0063228 .9607063 .9865813
*> ------------------------------------------------------------------------------
ret list
*> scalars:
*> r(icc3) = .408854229065962
*> r(se3) = .1636402482538196
*> r(icc2) = .9769574293643243
*> r(se2) = .0063228483990126
*> r(level) = 95
*> macros:
*> r(label3) : "region"
*> r(label2) : "state|region"
*> matrices:
*> r(ci3) : 1 x 2
*> r(ci2) : 1 x 2
mat b = (r(icc3), r(se3), r(ci3) r(icc2), r(se2), r(ci2))
mat list b
*> b[2,4]
*> c1 c2 ll ul
*> r1 .40885423 .16364025 .1550255 .7227831
*> r2 .97695743 .00632285 .96070626 .98658129

由此我们可以把这俩矩阵保存起来:

clear
mat list a
*> symmetric a[1,1]
*> c1
*> r1 .
svmat a
*> number of observations will be reset to 1
*> Press any key to continue, or Break to abort
*> Number of observations (_N) was 0, now 1.
gen v = "gsp"
gen class = _n
order v class
save data1, replace
*> file data1.dta saved
clear
mat list a
*> symmetric a[1,1]
*> c1
*> r1 .
svmat b
*> number of observations will be reset to 2
*> Press any key to continue, or Break to abort
*> Number of observations (_N) was 0, now 2.
gen v = "gsp"
order v
save data2, replace
*> file data2.dta saved

然后就可以循环所有的了:

cap mkdir "Random_effects_parameters"
cap mkdir "icc"
use productivity, clear
foreach i of varlist hwy - unemp {
di "`i'"
qui cap {
use productivity, clear
mixed `i' || region: || state:, mle
mat a = r(table)
estat icc
mat b = (r(icc3), r(se3), r(ci3) r(icc2), r(se2), r(ci2))

clear
svmat a
gen v = "`i'"
gen class = _n
order v class
save Random_effects_parameters/`i', replace

clear
svmat b
gen v = "`i'"
order v
save icc/`i', replace
}
}

合并结果:

appendall Random_effects_parameters
*> (9 observations deleted)
*> (variable v was str5, now str7 to accommodate using data's values)
tostring class, replace
*> class was float now str1
egen newclass = msub(class), f(1 2 3 4 5 6 7 8 9) r("b" "se" "z" "pvalue" "ll" "ul" "df" "crit" "eform")
drop class
ren a1 value_cons
ren a2 var_cons
ren a3 var_e
order v newclass
save Random_effects_parameters, replace
*> file Random_effects_parameters.dta saved
list
*> +----------------------------------------------------------------+
*> | v newclass value_~s var_cons var_e a4 |
*> |----------------------------------------------------------------|
*> 1. | unemp b 6.770185 .6514024 .746314 3.601394 |
*> 2. | unemp se .3073489 .4014016 .2170363 .1837828 |
*> 3. | unemp z 22.02769 .b .b .b |
*> 4. | unemp pvalue 0 .b .b .b |
*> 5. | unemp ll 6.167792 .1946835 .4220684 3.258614 |
*> |----------------------------------------------------------------|
*> 6. | unemp ul 7.372578 2.179564 1.319655 3.980231 |
*> 7. | unemp df . . . . |
*> 8. | unemp crit 1.959964 1.959964 1.959964 1.959964 |
*> 9. | unemp eform 0 0 0 0 |
*> 10. | hwy b 9.026958 .3048045 .3578027 .0054385 |
*> |----------------------------------------------------------------|
*> 11. | hwy se .2053362 .1801655 .0811456 .0002775 |
*> 12. | hwy z 43.96183 .b .b .b |
*> 13. | hwy pvalue 0 .b .b .b |
*> 14. | hwy ll 8.624505 .0956948 .2294039 .0049209 |
*> 15. | hwy ul 9.429409 .9708547 .5580673 .0060106 |
*> |----------------------------------------------------------------|
*> 16. | hwy df . . . . |
*> 17. | hwy crit 1.959964 1.959964 1.959964 1.959964 |
*> 18. | hwy eform 0 0 0 0 |
*> 19. | gsp b 10.65961 .4376123 .6080626 .0246633 |
*> 20. | gsp se .2503806 .2697616 .138273 .0012586 |
*> |----------------------------------------------------------------|
*> 21. | gsp z 42.57361 .b .b .b |
*> 22. | gsp pvalue 0 .b .b .b |
*> 23. | gsp ll 10.16887 .1307299 .3893907 .0223159 |
*> 24. | gsp ul 11.15034 1.464887 .949535 .0272577 |
*> 25. | gsp df . . . . |
*> |----------------------------------------------------------------|
*> 26. | gsp crit 1.959964 1.959964 1.959964 1.959964 |
*> 27. | gsp eform 0 0 0 0 |
*> 28. | water b 7.756548 .4871242 .8018785 .0346385 |
*> 29. | water se .2694501 .3137895 .1824776 .0017676 |
*> 30. | water z 28.78659 .b .b .b |
*> |----------------------------------------------------------------|
*> 31. | water pvalue 0 .b .b .b |
*> 32. | water ll 7.228436 .1378236 .513342 .0313417 |
*> 33. | water ul 8.28466 1.721694 1.252594 .0382822 |
*> 34. | water df . . . . |
*> 35. | water crit 1.959964 1.959964 1.959964 1.959964 |
*> |----------------------------------------------------------------|
*> 36. | water eform 0 0 0 0 |
*> 37. | emp b 7.124568 .4271744 .6054883 .0207226 |
*> 38. | emp se .2479106 .2629881 .1374675 .0010575 |
*> 39. | emp z 28.73846 .b .b .b |
*> 40. | emp pvalue 0 .b .b .b |
*> |----------------------------------------------------------------|
*> 41. | emp ll 6.638672 .1278106 .3880186 .0187503 |
*> 42. | emp ul 7.610464 1.427722 .9448415 .0229025 |
*> 43. | emp df . . . . |
*> 44. | emp crit 1.959964 1.959964 1.959964 1.959964 |
*> 45. | emp eform 0 0 0 0 |
*> |----------------------------------------------------------------|
*> 46. | private b 10.69631 .3936212 .4530668 .0291108 |
*> 47. | private se .2329682 .2308798 .1029507 .0014856 |
*> 48. | private z 45.91318 .b .b .b |
*> 49. | private pvalue 0 .b .b .b |
*> 50. | private ll 10.2397 .1246819 .2902305 .0263401 |
*> |----------------------------------------------------------------|
*> 51. | private ul 11.15292 1.242664 .7072636 .0321731 |
*> 52. | private df . . . . |
*> 53. | private crit 1.959964 1.959964 1.959964 1.959964 |
*> 54. | private eform 0 0 0 0 |
*> 55. | other b 8.905559 .5220582 .7043993 .023078 |
*> |----------------------------------------------------------------|
*> 56. | other se .2725905 .3214056 .1602948 .0011777 |
*> 57. | other z 32.6701 .b .b .b |
*> 58. | other pvalue 0 .b .b .b |
*> 59. | other ll 8.371291 .1561982 .4509386 .0208814 |
*> 60. | other ul 9.439826 1.744866 1.100324 .0255056 |
*> |----------------------------------------------------------------|
*> 61. | other df . . . . |
*> 62. | other crit 1.959964 1.959964 1.959964 1.959964 |
*> 63. | other eform 0 0 0 0 |
*> +----------------------------------------------------------------+

这里我使用了 appendall,是我编写的一个小命令,可以循环把一个文件夹里面所有的 dta 文件 append 起来,使用的时候把 appendall.ado 放到工作目录下面即可:

*! appendall: 合并子文件夹中所有的 dta 文件
*! 用法:appendall datadir
cap prog drop appendall
prog def appendall
syntax anything(name = filefolder)
local files: dir "`filefolder'" files "*.dta"
local first_file: word 1 of `files'

use "`filefolder'/`first_file'", clear
drop in 1/`=_N'

foreach i in `files' {
append using "`filefolder'/`i'"
}
end

再 append icc 的:

appendall icc
*> (2 observations deleted)
*> (variable v was str5, now str7 to accommodate using data's values)
ren b1 icc
ren b2 se
ren b3 l
ren b4 u
save icc, replace
*> file icc.dta saved
list
*> +-----------------------------------------------------+
*> | v icc se l u |
*> |-----------------------------------------------------|
*> 1. | unemp .1303037 .070809 .0421714 .3376856 |
*> 2. | unemp .2795931 .0638113 .1725861 .419323 |
*> 3. | hwy .4562629 .1616785 .1895854 .7506185 |
*> 4. | hwy .991859 .0023559 .9856681 .9953882 |
*> 5. | gsp .4088542 .1636402 .1550255 .7227831 |
*> |-----------------------------------------------------|
*> 6. | gsp .9769574 .0063228 .9607062 .9865813 |
*> 7. | water .3680183 .1643013 .1272719 .6992739 |
*> 8. | water .9738309 .0068837 .9563633 .9844202 |
*> 9. | emp .4055253 .1629987 .1534632 .7196454 |
*> 10. | emp .9803275 .0053749 .9665091 .9885123 |
*> |-----------------------------------------------------|
*> 11. | private .4494425 .158936 .1881876 .7419222 |
*> 12. | private .9667608 .0094065 .9424859 .9809966 |
*> 13. | other .4178019 .1647916 .1598114 .7302763 |
*> 14. | other .9815307 .0051415 .9682353 .9893226 |
*> +-----------------------------------------------------+

方法二:从 log 文件中提取结果

不过很快小伙伴就反映说他的返回值和回归结果显示不一样,似乎没有好的办法解决,不过我们也可以换成另外一种方法导出。

把运行结果存储为 log 文件:

*- 把运行结果存储为 log 文件
cap log close
log using temp.txt, replace text
use productivity, clear
foreach i of varlist hwy - unemp {
di "变量:`i'"
cap {
use productivity, clear
noi mixed `i' || region: || state:, mle
noi estat icc
}
}
log close

读取 log 文件:

infix strL v 1-2000 using temp.txt, clear
*> (397 observations read)

保留所需的结果所在行:

keep if index(v, "变量:") | index(v, "_cons") | index(v, "var(Residual)") | index(v, "region")
*> (332 observations deleted)
drop if index(v, "di") | index(v, "region: Identity") | index(v, "mixed")
*> (9 observations deleted)
drop if index(v[_n - 1], "变量:")
*> (7 observations deleted)

把变量拿到前面:

gen newv = v if index(v, "变量:")
*> (42 missing values generated)
carryforward newv, replace
*> newv: (42 real changes made)
drop if v == newv
*> (7 observations deleted)
order newv
save data1, replace
*> file data1.dta saved

最后把结果分成几类进行处理:

*- 处理 _cons
use data1, clear
keep if substr(v, 1, 5) == "_cons"
*> (35 observations deleted)
replace v = subinstr(v, "_cons |", "", .)
*> (7 real changes made)
replace v = subinstr(v, " ", " ", .)
*> (7 real changes made)
replace v = subinstr(v, " ", " ", .)
*> (7 real changes made)
replace v = subinstr(v, " ", " ", .)
*> (7 real changes made)
replace v = subinstr(v, " ", " ", .)
*> (0 real changes made)
replace v = subinstr(v, " ", " ", .)
*> (0 real changes made)
split v, parse(" ")
*> variables created as string:
*> v1 v2 v3 v4 v5 v6
drop v
ren (v1 v2 v3 v4 v5 v6) (b se z p l u)
destring, replace
*> newv: contains nonnumeric characters; no replace
*> b: all characters numeric; replaced as double
*> se: all characters numeric; replaced as double
*> z: all characters numeric; replaced as double
*> p: all characters numeric; replaced as byte
*> l: all characters numeric; replaced as double
*> u: all characters numeric; replaced as double
save _cons, replace
*> file _cons.dta saved
list
*> +-----------------------------------------------------------------------+
*> | newv b se z p l u |
*> |-----------------------------------------------------------------------|
*> 1. | 变量:hwy 9.026957 .2053362 43.96 0 8.624505 9.429409 |
*> 2. | 变量:water 7.756548 .2694501 28.79 0 7.228435 8.28466 |
*> 3. | 变量:other 8.905559 .2725905 32.67 0 8.371291 9.439826 |
*> 4. | 变量:private 10.69631 .2329682 45.91 0 10.2397 11.15292 |
*> 5. | 变量:gsp 10.65961 .2503806 42.57 0 10.16887 11.15035 |
*> |-----------------------------------------------------------------------|
*> 6. | 变量:emp 7.124568 .2479106 28.74 0 6.638672 7.610464 |
*> 7. | 变量:unemp 6.770185 .3073489 22.03 0 6.167792 7.372578 |
*> +-----------------------------------------------------------------------+
*- 处理 var(_cons)
use data1, clear
keep if index(v, "var(_cons)")
*> (28 observations deleted)
replace v = subinstr(v, "var(_cons) |", "", .)
*> (14 real changes made)
replace v = subinstr(v, " ", " ", .)
*> (14 real changes made)
replace v = subinstr(v, " ", " ", .)
*> (14 real changes made)
replace v = subinstr(v, " ", " ", .)
*> (14 real changes made)
replace v = subinstr(v, " ", " ", .)
*> (0 real changes made)
replace v = subinstr(v, " ", " ", .)
*> (0 real changes made)
split v, parse(" ")
*> variables created as string:
*> v1 v2 v3 v4
drop v
ren (v1 v2 v3 v4) (b se l u)
destring, replace
*> newv: contains nonnumeric characters; no replace
*> b: all characters numeric; replaced as double
*> se: all characters numeric; replaced as double
*> l: all characters numeric; replaced as double
*> u: all characters numeric; replaced as double
egen group = fill(1 2 1 2)
tostring group, replace
*> group was float now str1
egen newgroup = msub(group), f(1 2) r("region" "state")
drop group
order newv newgroup
save var_cons , replace
*> file var_cons.dta saved
list
*> +----------------------------------------------------------------------+
*> | newv newgroup b se l u |
*> |----------------------------------------------------------------------|
*> 1. | 变量:hwy region .3048045 .1801655 .0956948 .9708547 |
*> 2. | 变量:hwy state .3578027 .0811456 .2294039 .5580673 |
*> 3. | 变量:water region .4871242 .3137895 .1378236 1.721694 |
*> 4. | 变量:water state .8018785 .1824776 .513342 1.252594 |
*> 5. | 变量:other region .5220583 .3214056 .1561982 1.744866 |
*> |----------------------------------------------------------------------|
*> 6. | 变量:other state .7043993 .1602948 .4509386 1.100324 |
*> 7. | 变量:private region .3936212 .2308798 .1246819 1.242663 |
*> 8. | 变量:private state .4530668 .1029507 .2902305 .7072637 |
*> 9. | 变量:gsp region .4376123 .2697616 .1307299 1.464887 |
*> 10. | 变量:gsp state .6080626 .138273 .3893907 .949535 |
*> |----------------------------------------------------------------------|
*> 11. | 变量:emp region .4271744 .2629881 .1278106 1.427722 |
*> 12. | 变量:emp state .6054883 .1374675 .3880186 .9448415 |
*> 13. | 变量:unemp region .6514024 .4014016 .1946835 2.179564 |
*> 14. | 变量:unemp state .746314 .2170363 .4220684 1.319655 |
*> +----------------------------------------------------------------------+
*- 处理 var(Residual)
use data1, clear
keep if index(v, "var(Residual)")
*> (35 observations deleted)
replace v = subinstr(v, "var(Residual) |", "", .)
*> (7 real changes made)
replace v = subinstr(v, " ", " ", .)
*> (7 real changes made)
replace v = subinstr(v, " ", " ", .)
*> (7 real changes made)
replace v = subinstr(v, " ", " ", .)
*> (7 real changes made)
replace v = subinstr(v, " ", " ", .)
*> (0 real changes made)
replace v = subinstr(v, " ", " ", .)
*> (0 real changes made)
split v, parse(" ")
*> variables created as string:
*> v1 v2 v3 v4
drop v
ren (v1 v2 v3 v4) (b se l u)
destring, replace
*> newv: contains nonnumeric characters; no replace
*> b: all characters numeric; replaced as double
*> se: all characters numeric; replaced as double
*> l: all characters numeric; replaced as double
*> u: all characters numeric; replaced as double
save var_Residual, replace
*> file var_Residual.dta saved
list
*> +-----------------------------------------------------------+
*> | newv b se l u |
*> |-----------------------------------------------------------|
*> 1. | 变量:hwy .0054385 .0002775 .0049209 .0060106 |
*> 2. | 变量:water .0346385 .0017676 .0313417 .0382822 |
*> 3. | 变量:other .023078 .0011777 .0208814 .0255056 |
*> 4. | 变量:private .0291108 .0014856 .0263401 .0321731 |
*> 5. | 变量:gsp .0246633 .0012586 .0223159 .0272577 |
*> |-----------------------------------------------------------|
*> 6. | 变量:emp .0207226 .0010575 .0187503 .0229025 |
*> 7. | 变量:unemp 3.601394 .1837828 3.258614 3.980231 |
*> +-----------------------------------------------------------+
*- 处理 icc
use data1, clear
keep if index(v, "region")
*> (28 observations deleted)
replace v = subinstr(v, " ", " ", .)
*> (14 real changes made)
replace v = subinstr(v, " ", " ", .)
*> (14 real changes made)
replace v = subinstr(v, " ", " ", .)
*> (14 real changes made)
replace v = subinstr(v, " ", " ", .)
*> (0 real changes made)
replace v = subinstr(v, " ", " ", .)
*> (0 real changes made)
split v, parse(" " " | ")
*> variables created as string:
*> v1 v2 v3 v4 v5
drop v
ren (v1 v2 v3 v4 v5) (level icc se l u)
destring, replace
*> newv: contains nonnumeric characters; no replace
*> level: contains nonnumeric characters; no replace
*> icc: all characters numeric; replaced as double
*> se: all characters numeric; replaced as double
*> l: all characters numeric; replaced as double
*> u: all characters numeric; replaced as double
save icc, replace
*> file icc.dta saved
list
*> +--------------------------------------------------------------------------+
*> | newv level icc se l u |
*> |--------------------------------------------------------------------------|
*> 1. | 变量:hwy region .4562629 .1616785 .1895854 .7506184 |
*> 2. | 变量:hwy state|region .991859 .0023559 .9856681 .9953882 |
*> 3. | 变量:water region .3680183 .1643013 .1272719 .6992739 |
*> 4. | 变量:water state|region .9738309 .0068837 .9563633 .9844202 |
*> 5. | 变量:other region .4178018 .1647916 .1598114 .7302763 |
*> |--------------------------------------------------------------------------|
*> 6. | 变量:other state|region .9815307 .0051415 .9682353 .9893226 |
*> 7. | 变量:private region .4494425 .158936 .1881876 .7419222 |
*> 8. | 变量:private state|region .9667608 .0094065 .9424859 .9809966 |
*> 9. | 变量:gsp region .4088542 .1636402 .1550255 .7227831 |
*> 10. | 变量:gsp state|region .9769574 .0063228 .9607063 .9865813 |
*> |--------------------------------------------------------------------------|
*> 11. | 变量:emp region .4055253 .1629987 .1534632 .7196454 |
*> 12. | 变量:emp state|region .9803276 .0053749 .9665091 .9885123 |
*> 13. | 变量:unemp region .1303037 .070809 .0421714 .3376856 |
*> 14. | 变量:unemp state|region .279593 .0638113 .172586 .419323 |
*> +--------------------------------------------------------------------------+

这样我们就解决了这个问题~

最后我们再绘图展示下处理结果:

use var_cons.dta, clear
replace newv = subinstr(newv, "变量:", "", .)
*> (14 real changes made)
sencode newv, gen(x) gsort(b)
gen x1 = x - 0.2
gen x2 = x + 0.2
codebook x
*> ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
*> x (unlabeled)
*> ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
*> Type: Numeric (byte)
*> Label: x
*> Range: [1,7] Units: 1
*> Unique values: 7 Missing .: 0/14
*> Tabulation: Freq. Numeric Label
*> 2 1 hwy
*> 2 2 private
*> 2 3 emp
*> 2 4 gsp
*> 2 5 water
*> 2 6 other
*> 2 7 unemp
tw bar b x1 if newgroup == "region", barwidth(0.4) ///
color("254 212 57") fintensity(50) || ///
bar b x2 if newgroup == "state", barwidth(0.4) ///
color("112 154 225") fintensity(50) || ///
rcap u l x1 if newgroup == "region", color("254 212 57") || ///
rcap u l x2 if newgroup == "state", color("112 154 225") ///
leg(order(1 "region" 2 "state" 3 "region" 4 "state")) ///
xla(1 "hwy" 2 "private" 3 "emp" 4 "gsp" ///
5 "water" 6 "other" 7 "unemp") ///
ti("不同变量的估计结果对比") ///
subti("数据处理:微信公众号 RStata")

点击这里跳转到 RStata 短书平台获取附件:Stata:如何批量提取多层混合效应线性回归结果的估计值、标准差等统计量

评论