美文网首页
stata结果导入excel-交叉分析

stata结果导入excel-交叉分析

作者: Hobbit的理查德 | 来源:发表于2020-02-19 17:34 被阅读0次

    前段时间知道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. 补充

    相关文章

      网友评论

          本文标题:stata结果导入excel-交叉分析

          本文链接:https://www.haomeiwen.com/subject/uyoafhtx.html