stata结果导入excel-交叉分析

2020-02-19  本文已影响0人  Hobbit的理查德

前段时间知道stata16可以直接导入SPSS数据,就把stata16安装了

然后,就想了解stata16的新功能,官方介绍:New in Stata 16

最开始,是里面的Reproducible reporting吸引我,毕竟一直在想着怎么写动态分析报告,即分析结果和报告同步更新。

就研究了一下里面提到的dyndocputexcelputword命令

首先,就是研究了putexcel命令,想着把频率分析结果能直接导入excel,尤其是有大量变量的时候

简单尝试了一下,发现还是很好用,尤其是导出来中文不会乱码,而且格式自定义,其他命令如logoutasdoc等都有各种问题的。

接下来,分不同帖子写写不同分析结果如何批量导出结果至excel,

首先是,stata结果导入excel-频率分析

接着是,stata结果导入excel-多重响应

然后是,交叉分析结果导出excel

1. 思路

总的来说,思路都是先分析出结果组成矩阵,再导出excel:

  1. 在stata中将交叉结果形成矩阵(即交叉分析结果表);
  2. 再将矩阵导入excel;
  3. 根据每个矩阵行数,自动在上个矩阵结束后空一行,导入新的矩阵;
  4. 通过循环,只需添加变量名,则自动生成新的表;

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'{

将行变量和列变量分别存至暂元rowvarcolvar中,之后只需要添加行变量和列变量就行。

第三部分:交叉分析结果构成矩阵

// 两变量交叉分析
tab `r' `c',matcell(freq)
quietly fre `r',nov
local rlabel=r(lab_valid)
quietly fre `c',nov
local clabel=r(lab_valid)

进行交叉分析,将频率存成矩阵freq,将行变量和列变量的值标签分别存至暂元rlabelclabel

以行变量为P4Q17,列变量为P4Q3为例,矩阵freq,行变量标签rlabel,列变量标签clabel分别为:

tab.png
 // 频率结果表
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分别是百分比结果的开始列和结束列:

cn.png
// 含行百分比结果
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列,结果:

矩阵rper.png
第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...]))`乘数位置和行百分比矩阵不同!

矩阵cper.png 矩阵ctable.png

第四部分:结果导出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. 补充

上一篇下一篇

猜你喜欢

热点阅读