stata结果导入excel-交叉分析
前段时间知道stata16可以直接导入SPSS数据,就把stata16安装了
然后,就想了解stata16的新功能,官方介绍:New in Stata 16
最开始,是里面的Reproducible reporting吸引我,毕竟一直在想着怎么写动态分析报告,即分析结果和报告同步更新。
就研究了一下里面提到的dyndoc
,putexcel
,putword
命令
首先,就是研究了putexcel
命令,想着把频率分析结果能直接导入excel,尤其是有大量变量的时候
简单尝试了一下,发现还是很好用,尤其是导出来中文不会乱码,而且格式自定义,其他命令如logout
,asdoc
等都有各种问题的。
接下来,分不同帖子写写不同分析结果如何批量导出结果至excel,
然后是,交叉分析结果导出excel
1. 思路
总的来说,思路都是先分析出结果组成矩阵,再导出excel:
- 在stata中将交叉结果形成矩阵(即交叉分析结果表);
- 再将矩阵导入excel;
- 根据每个矩阵行数,自动在上个矩阵结束后空一行,导入新的矩阵;
- 通过循环,只需添加变量名,则自动生成新的表;
2. 所有代码
第一部分:设置
local rownums=1
local rntable=1
putexcel set result.xlsx,sheet("交叉分析",replace) modify
第二部分:循环
local rowvar "P4Q17 P2Q1 P4Q10"
local colvar "P4Q3 P4Q6 P4Q7 P4Q8"
foreach r of varlist `rowvar'{
foreach c of varlist `colvar'{
第三部分:交叉分析结果构成矩阵
// 两变量交叉分析
tab `r' `c',matcell(freq)
quietly fre `r',nov
local rlabel=r(lab_valid)
quietly fre `c',nov
local clabel=r(lab_valid)
// 频率结果表
mata:st_matrix("rtotal", rowsum(st_matrix("freq")))
mat coljoin rfreq=freq rtotal
mat colnames rfreq=`clabel' "总计"
mata:st_matrix("ctotal", colsum(st_matrix("rfreq")))
mat colnames ctotal=`clabel' "总计"
mat rowjoin ftable=rfreq ctotal
mat rownames ftable=`rlabel' "总计"
local cn:colsof rfreq
local cns=`cn'+66
local cne=`cns'+`cn'
local cns=char(`cns')
local cne=char(`cne')
// 含行百分比结果
local cn:colsof ftable
mat rper=syminv(diag(ftable[1...,`cn']))*ftable
mat coljoin rtable=ftable rper
// 含列百分比结果
local rn:rowsof ftable
mat cper=ftable*syminv(diag(ftable[`rn',1...]))
mat coljoin ctable=ftable cper
第四部分:结果导出excel
// 行百分比结果导出excel
putexcel a`rownums'=matrix(rtable),names txtwrap
local rntable:rowsof rtable
local rownume=`rownums'+`rntable'
// 设置格式
putexcel `cns'`rownums':`cne'`rownume',nformat(#.00%)
local rownums=`rownums'+`rntable'+2
// 列百分比结果导出excel
putexcel a`rownums'=matrix(ctable),names txtwrap
local rntable:rowsof ctable
local rownume=`rownums'+`rntable'
// 设置格式
putexcel `cns'`rownums':`cne'`rownume',nformat(#.00%)
local rownums=`rownums'+`rntable'+2
}
3.代码解释
第一部分:设置
local rownums=1
local rntable=1
putexcel set result.xlsx,sheet("交叉分析",replace) modify
与 stata结果导入excel-频率分析 stata结果导入excel-多重响应 相似
第二部分:循环
local rowvar "P4Q17 P2Q1 P4Q10"
local colvar "P4Q3 P4Q6 P4Q7 P4Q8"
foreach r of varlist `rowvar'{
foreach c of varlist `colvar'{
将行变量和列变量分别存至暂元rowvar
和colvar
中,之后只需要添加行变量和列变量就行。
第三部分:交叉分析结果构成矩阵
// 两变量交叉分析
tab `r' `c',matcell(freq)
quietly fre `r',nov
local rlabel=r(lab_valid)
quietly fre `c',nov
local clabel=r(lab_valid)
进行交叉分析,将频率存成矩阵freq,将行变量和列变量的值标签分别存至暂元rlabel
,clabel
以行变量为P4Q17,列变量为P4Q3为例,矩阵freq,行变量标签rlabel
,列变量标签clabel
分别为:
// 频率结果表
mata:st_matrix("rtotal", rowsum(st_matrix("freq")))
mat coljoin rfreq=freq rtotal
mat colnames rfreq=`clabel' "总计"
mata:st_matrix("ctotal", colsum(st_matrix("rfreq")))
mat colnames ctotal=`clabel' "总计"
mat rowjoin ftable=rfreq ctotal
mat rownames ftable=`rlabel' "总计"
生成含行总计和列总计的频率结果矩阵ftable
第1句:根据矩阵freq,生成每行的总计矩阵rtotal:
矩阵rtotal.png
第2-3句:将矩阵freq和rtotal拼接成矩阵rfreq,并将矩阵rfreq的列名变为列变量标签和"总计":
矩阵rfreq.png
第4-5句:根据矩阵rfreq,生成每列的总计矩阵ctotal,并将矩阵ctotal的列名变为列变量标签和"总计":
矩阵ctotal.png
第6-7句:将矩阵rfreq和ctotal拼接成矩阵ftable,并将矩阵ftable的行名变为行变量标签和"总计":
矩阵ftable.png
local cn:colsof rfreq
local cns=`cn'+66
local cne=`cns'+`cn'
local cns=char(`cns')
local cne=char(`cne')
目的:用于后续循环时,结果导入Excel的单元定位
第1句:将矩阵rfreq的列数存至暂元cn
第2-3句:将暂元cn
+66,得到暂元cns
;再用暂元cns
+暂元cn
,得到暂元暂元cne
第4-5句:将数字转为字母,得到暂元cns
和暂元cne
其中,暂元cns
和暂元cne
分别是百分比结果的开始列和结束列:
// 含行百分比结果
local cn:colsof ftable
mat rper=syminv(diag(ftable[1...,`cn']))*ftable
mat coljoin rtable=ftable rper
目的:得到含行百分比的结果矩阵
第1句:将矩阵ftable的列数存至暂元cn
第2句:ftable[1...,
cn']表示子矩阵,即矩阵ftable的最后1列;
diag(ftable[1...,cn'])
得到子矩阵的对角矩阵;syminv(diag(ftable[1...,
cn']))得到对角矩阵的逆矩阵;
mat rper=syminv(diag(ftable[1...,cn']))*ftable
将逆矩阵乘以矩阵ftable,得到矩阵rper,效果为,将矩阵ftable的每列都除以最后1列,结果:
第3句:将矩阵ftable和rper进行拼接,得到含行百分比结果的矩阵rtable:
矩阵rtable.png
// 含列百分比结果
local rn:rowsof ftable
mat cper=ftable\*syminv(diag(ftable[`rn',1...]))
mat coljoin ctable=ftable cper
同理,得到列百分比矩阵cper和含列百分比的结果矩阵ctable:
注意:ftable\*syminv(diag(ftable[
rn',1...]))`乘数位置和行百分比矩阵不同!
第四部分:结果导出excel
// 行百分比结果导出excel
putexcel a`rownums'=matrix(rtable),names txtwrap
local rntable:rowsof rtable
local rownume=`rownums'+`rntable'
// 设置格式
putexcel `cns'`rownums':`cne'`rownume',nformat(#.00%)
local rownums=`rownums'+`rntable'+2
目的:将含行百分比结果导出Excel
第1句:见矩阵rtable导出Excel,从单元格A1(开始循环时,暂元rownums
为1)导出;
第2句:将矩阵rtable的行数存至暂元rntable
,示例为3;
第3句:将暂元rownums
(结果表开始行数)加上暂元rntable
(结果表行数)得到暂元rownume
,即结果表的结束行数;
第4句:将百分比设为保留两位小数的百分数格式,示例单元格范围是E1:H4
第5句:更新暂元rownums
,即下一个结果表开始行数;
// 列百分比结果导出excel
putexcel a`rownums'=matrix(ctable),names txtwrap
local rntable:rowsof ctable
local rownume=`rownums'+`rntable'
// 设置格式
putexcel `cns'`rownums':`cne'`rownume',nformat(#.00%)
local rownums=`rownums'+`rntable'+2
同理,将含列百分比结果导出Excel
4.最后效果
跑上述代码的效果(行变量:P4Q17 P2Q1 P4Q10;列变量:P4Q3 P4Q6 P4Q7 P4Q8)后:
共得到3*4=12个交叉结果,每个交叉结果都呈现含行百分比和列百分比的结果表:
tab2.gif
5. 补充
-
根据实际需求修改,只呈现行百分比或者列百分比,最终可实现批量导出多份数据的多个变量的交叉分析结果~