前段时间知道stata16可以直接导入SPSS数据,就把stata16安装了
然后,就想了解stata16的新功能,官方介绍:New in Stata 16
最开始,是里面的Reproducible reporting吸引我,毕竟一直在想着怎么写动态分析报告,即分析结果和报告同步更新。
就研究了一下里面提到的dyndoc
,putexcel
,putword
命令
首先,就是研究了putexcel
命令,想着把频率分析结果能直接导入excel,尤其是有大量变量的时候
简单尝试了一下,发现还是很好用,尤其是导出来中文不会乱码,而且格式自定义,其他命令如logout
,asdoc
等都有各种问题的。
接下来,分不同帖子写写不同分析结果如何批量导出结果至excel,
还有是,描述统计分析结果导出Excel
1. 思路
目标:将多个变量的描述统计以及对该变量的分类描述统计结果批量导出Excel
总的来说,思路都是先分析出结果组成矩阵,再导出excel:
- 在stata中将描述统计分析结果形成矩阵(即描述统计分析结果表);
- 再将矩阵导入excel;
- 根据每个矩阵行数,自动在上个矩阵结束后空一行,导入新的矩阵;
- 通过循环,只需添加变量名,则自动生成新的表;
2. 所有代码
第一部分:设置
local rownum=1
local rntable=1
putexcel set result.xlsx,sheet("描述统计",replace) modify
第二部分:循环
local depvar "P4Q4 P4Q5 P2Q1 P2Q2 P2Q3 P2Q4 P2Q5"
local indepvar "P4Q3 P4Q6 P4Q7"
foreach d of varlist `depvar' {
第三部分:分析及导出
(1)描述统计分析
local dlabel:var label `d'
local dlabel=subinstr("`dlabel'",":","",.)
//描述统计分析
tabstat `d',s(n mean sd min median max) save
mat destable=r(StatTotal)'
mat colnames destable="样本量" "均值" "标准差" "最小值" "中位数" "最大值"
mat rownames destable=`dlabel'
// 结果导出excel
putexcel a`rownum'=matrix(destable),names txtwrap hcenter vcenter
local rntable:rowsof destable
local rownum=`rownum'+`rntable'+2
(2)分类描述统计分析
foreach i of varlist `indepvar' {
//分类变量
quietly fre `i',nov
local ilabel=r(lab_valid)
local inum=r(r)
//分类统计描述分析
tabstat `d',s(n mean sd min median max) by(`i') save
// 分类描述表
mat desbytable=r(Stat1)
forvalues n=2(1)`inum' {
mat coljoin desbytable=desbytable r(Stat`n')
}
mat coljoin desbytable=desbytable r(StatTotal)
mat desbytable=desbytable'
mat colnames desbytable="样本量" "均值" "标准差" "最小值" "中位数" "最大值"
mat rownames desbytable=`ilabel' "总计"
// 结果导出excel
putexcel a`rownum'=matrix(desbytable),names txtwrap hcenter vcenter
local rntable:rowsof desbytable
local rownum=`rownum'+`rntable'+2
}
}
第四部分:设置格式
putexcel c1:c`rownum',nformat(0.00)
putexcel d1:d`rownum',nformat(0.000)
3.代码解释
第一部分:设置
local rownum=1
local rntable=1
putexcel set result.xlsx,sheet("描述统计",replace) modify
与 stata结果导入excel-频率分析 stata结果导入excel-多重响应 stata结果导入excel-交叉分析 相似
第二部分:循环
local depvar "P4Q4 P4Q5 P2Q1 P2Q2 P2Q3 P2Q4 P2Q5"
local indepvar "P4Q3 P4Q6 P4Q7"
foreach d of varlist `depvar' {
将需要描述统计分析的变量(因变量)和分类变量分别存至暂元depvar
和indepvar
中,之后只需要添加因变量和分类变量就行。
第三部分:分析及导出
(1)描述统计分析
local dlabel:var label `d'
local dlabel=subinstr("`dlabel'",":","",.)
第1句:将因变量的变量标签存至暂元dlabel
,便于后期对矩阵命名;
第2句:去掉变量标签中冒号,以免后期矩阵命名出错;
以因变量P4Q4为例:
tabstat `d',s(n mean sd min median max) save
mat destable=r(StatTotal)'
mat colnames destable="样本量" "均值" "标准差" "最小值" "中位数" "最大值"
mat rownames destable=`dlabel'
第1句:进行描述统计分析,得到因变量的样本量,均值,标准差,最小值,中位数和最大值统计量。
注意:添加选项save
,得到统计结果矩阵r(StatTotal)
第2句:对矩阵r(StatTotal)进行转置,加单引号,得到矩阵destable;
第3句:将矩阵destable的列名修改成样本量,均值,标准差,最小值,中位数和最大值
第4句:将矩阵destable的行名修改成因变量的变量标签
矩阵destable:
putexcel a`rownum'=matrix(destable),names txtwrap hcenter vcenter
local rntable:rowsof destable
local rownum=`rownum'+`rntable'+2
目的:将矩阵destable导出Excel
第1句:将矩阵destable导出Excel,从单元格A1(开始循环时,暂元rownum
为1)导出,带上矩阵行列名,自动换行,居中
第2句:将矩阵destable的行数存至暂元rntable
中;
第3句:更新暂元rownum
,便于下次循环;
(2)分类描述统计分析
foreach i of varlist `indepvar' {
quietly fre `i',nov
local ilabel=r(lab_valid)
local inum=r(r)
第1句:循环分类变量;
第2-4句:将分类变量的分类标签及类别数量分别存至暂元ilabel
和inum
,便于分类描述统计矩阵的生成。
以变量P4Q6为分类变量为例:
tabstat `d',s(n mean sd min median max) by(`i') save
分类描述统计分析,添加选项save
保存结果,其中,每行结果存为了1个矩阵:
mat desbytable=r(Stat1)
forvalues n=2(1)`inum' {
mat coljoin desbytable=desbytable r(Stat`n')
}
mat coljoin desbytable=desbytable r(StatTotal)
mat desbytable=desbytable'
mat colnames desbytable="样本量" "均值" "标准差" "最小值" "中位数" "最大值"
mat rownames desbytable=`ilabel' "总计"
第1-4句:通过循环,将所有r(Stat数字)
的矩阵拼接起来;
第5句:再和矩阵r(StatTotal)合并起来;
第6句:对合并后的矩阵进行转置,得到分类描述统计矩阵desbytable;
第7-8句:对矩阵desbytable加上行列名;
putexcel a`rownum'=matrix(desbytable),names txtwrap hcenter vcenter
local rntable:rowsof desbytable
local rownum=`rownum'+`rntable'+2
}
}
目的:将矩阵desbytable导出Excel
第1句:将矩阵desbytable导出Excel,从单元格A4(开始循环时,此时暂元rownum
为4)导出,带上矩阵行列名,自动换行,居中
第2句:将矩阵desbytable的行数存至暂元rntable
中;
第3句:更新暂元rownum
,便于下次循环;
第四部分:格式设置
putexcel c1:c`rownum',nformat(0.00)
putexcel d1:d`rownum',nformat(0.000)
将均值(C列)导出为保留2位小数的数值;标准差(D列)导出为保留3位小数的数值
4.最后效果
跑上述代码的效果(因变量:P4Q4 P4Q5 P2Q1 P2Q2 P2Q3 P2Q4 P2Q5;分类变量:P4Q3 P4Q6 P4Q7)后:
共得到7+7*3=28个描述统计结果:
5. 补充
- 根据实际需求修改,最终可实现批量导出多份数据的多个变量的描述统计和分类描述结果~
预期接下来:
stata结果导入excel-方差分析