stata结果导入excel-交叉分析

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,128评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,316评论 3 388
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,737评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,283评论 1 287
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,384评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,458评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,467评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,251评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,688评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,980评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,155评论 1 342
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,818评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,492评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,142评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,382评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,020评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,044评论 2 352

推荐阅读更多精彩内容