前段時(shí)間知道stata16可以直接導(dǎo)入SPSS數(shù)據(jù)故痊,就把stata16安裝了
然后,就想了解stata16的新功能玖姑,官方介紹:New in Stata 16
最開始愕秫,是里面的Reproducible reporting吸引我,畢竟一直在想著怎么寫動態(tài)分析報(bào)告客峭,即分析結(jié)果和報(bào)告同步更新。
就研究了一下里面提到的dyndoc
抡柿,putexcel
舔琅,putword
命令
首先,就是研究了putexcel
命令洲劣,想著把頻率分析結(jié)果能直接導(dǎo)入excel备蚓,尤其是有大量變量的時(shí)候
簡單嘗試了一下,發(fā)現(xiàn)還是很好用囱稽,尤其是導(dǎo)出來中文不會亂碼郊尝,而且格式自定義,其他命令如logout
战惊,asdoc
等都有各種問題的流昏。
接下來,分不同帖子寫寫不同分析結(jié)果如何批量導(dǎo)出結(jié)果至excel吞获,
首先是况凉,stata結(jié)果導(dǎo)入excel-頻率分析
接著是,stata結(jié)果導(dǎo)入excel-多重響應(yīng)
然后是各拷,交叉分析結(jié)果導(dǎo)出excel
1. 思路
總的來說刁绒,思路都是先分析出結(jié)果組成矩陣,再導(dǎo)出excel:
- 在stata中將交叉結(jié)果形成矩陣(即交叉分析結(jié)果表)烤黍;
- 再將矩陣導(dǎo)入excel知市;
- 根據(jù)每個(gè)矩陣行數(shù),自動在上個(gè)矩陣結(jié)束后空一行速蕊,導(dǎo)入新的矩陣嫂丙;
- 通過循環(huán),只需添加變量名规哲,則自動生成新的表奢入;
2. 所有代碼
第一部分:設(shè)置
local rownums=1
local rntable=1
putexcel set result.xlsx,sheet("交叉分析",replace) modify
第二部分:循環(huán)
local rowvar "P4Q17 P2Q1 P4Q10"
local colvar "P4Q3 P4Q6 P4Q7 P4Q8"
foreach r of varlist `rowvar'{
foreach c of varlist `colvar'{
第三部分:交叉分析結(jié)果構(gòu)成矩陣
// 兩變量交叉分析
tab `r' `c',matcell(freq)
quietly fre `r',nov
local rlabel=r(lab_valid)
quietly fre `c',nov
local clabel=r(lab_valid)
// 頻率結(jié)果表
mata:st_matrix("rtotal", rowsum(st_matrix("freq")))
mat coljoin rfreq=freq rtotal
mat colnames rfreq=`clabel' "總計(jì)"
mata:st_matrix("ctotal", colsum(st_matrix("rfreq")))
mat colnames ctotal=`clabel' "總計(jì)"
mat rowjoin ftable=rfreq ctotal
mat rownames ftable=`rlabel' "總計(jì)"
local cn:colsof rfreq
local cns=`cn'+66
local cne=`cns'+`cn'
local cns=char(`cns')
local cne=char(`cne')
// 含行百分比結(jié)果
local cn:colsof ftable
mat rper=syminv(diag(ftable[1...,`cn']))*ftable
mat coljoin rtable=ftable rper
// 含列百分比結(jié)果
local rn:rowsof ftable
mat cper=ftable*syminv(diag(ftable[`rn',1...]))
mat coljoin ctable=ftable cper
第四部分:結(jié)果導(dǎo)出excel
// 行百分比結(jié)果導(dǎo)出excel
putexcel a`rownums'=matrix(rtable),names txtwrap
local rntable:rowsof rtable
local rownume=`rownums'+`rntable'
// 設(shè)置格式
putexcel `cns'`rownums':`cne'`rownume',nformat(#.00%)
local rownums=`rownums'+`rntable'+2
// 列百分比結(jié)果導(dǎo)出excel
putexcel a`rownums'=matrix(ctable),names txtwrap
local rntable:rowsof ctable
local rownume=`rownums'+`rntable'
// 設(shè)置格式
putexcel `cns'`rownums':`cne'`rownume',nformat(#.00%)
local rownums=`rownums'+`rntable'+2
}
3.代碼解釋
第一部分:設(shè)置
local rownums=1
local rntable=1
putexcel set result.xlsx,sheet("交叉分析",replace) modify
與 stata結(jié)果導(dǎo)入excel-頻率分析 stata結(jié)果導(dǎo)入excel-多重響應(yīng) 相似
第二部分:循環(huán)
local rowvar "P4Q17 P2Q1 P4Q10"
local colvar "P4Q3 P4Q6 P4Q7 P4Q8"
foreach r of varlist `rowvar'{
foreach c of varlist `colvar'{
將行變量和列變量分別存至?xí)涸?code>rowvar和colvar
中,之后只需要添加行變量和列變量就行。
第三部分:交叉分析結(jié)果構(gòu)成矩陣
// 兩變量交叉分析
tab `r' `c',matcell(freq)
quietly fre `r',nov
local rlabel=r(lab_valid)
quietly fre `c',nov
local clabel=r(lab_valid)
進(jìn)行交叉分析腥光,將頻率存成矩陣freq关顷,將行變量和列變量的值標(biāo)簽分別存至?xí)涸?code>rlabel,clabel
以行變量為P4Q17武福,列變量為P4Q3為例议双,矩陣freq,行變量標(biāo)簽rlabel
捉片,列變量標(biāo)簽clabel
分別為:
// 頻率結(jié)果表
mata:st_matrix("rtotal", rowsum(st_matrix("freq")))
mat coljoin rfreq=freq rtotal
mat colnames rfreq=`clabel' "總計(jì)"
mata:st_matrix("ctotal", colsum(st_matrix("rfreq")))
mat colnames ctotal=`clabel' "總計(jì)"
mat rowjoin ftable=rfreq ctotal
mat rownames ftable=`rlabel' "總計(jì)"
生成含行總計(jì)和列總計(jì)的頻率結(jié)果矩陣ftable
第1句:根據(jù)矩陣freq平痰,生成每行的總計(jì)矩陣rtotal:
第2-3句:將矩陣freq和rtotal拼接成矩陣rfreq,并將矩陣rfreq的列名變?yōu)榱凶兞繕?biāo)簽和"總計(jì)":
第4-5句:根據(jù)矩陣rfreq伍纫,生成每列的總計(jì)矩陣ctotal宗雇,并將矩陣ctotal的列名變?yōu)榱凶兞繕?biāo)簽和"總計(jì)":
第6-7句:將矩陣rfreq和ctotal拼接成矩陣ftable,并將矩陣ftable的行名變?yōu)樾凶兞繕?biāo)簽和"總計(jì)":
local cn:colsof rfreq
local cns=`cn'+66
local cne=`cns'+`cn'
local cns=char(`cns')
local cne=char(`cne')
目的:用于后續(xù)循環(huán)時(shí)莹规,結(jié)果導(dǎo)入Excel的單元定位
第1句:將矩陣rfreq的列數(shù)存至?xí)涸?code>cn
第2-3句:將暫元cn
+66赔蒲,得到暫元cns
;再用暫元cns
+暫元cn
,得到暫元暫元cne
第4-5句:將數(shù)字轉(zhuǎn)為字母良漱,得到暫元cns
和暫元cne
其中舞虱,暫元cns
和暫元cne
分別是百分比結(jié)果的開始列和結(jié)束列:
// 含行百分比結(jié)果
local cn:colsof ftable
mat rper=syminv(diag(ftable[1...,`cn']))*ftable
mat coljoin rtable=ftable rper
目的:得到含行百分比的結(jié)果矩陣
第1句:將矩陣ftable的列數(shù)存至?xí)涸?code>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列蒋失,結(jié)果:
第3句:將矩陣ftable和rper進(jìn)行拼接配并,得到含行百分比結(jié)果的矩陣rtable:
// 含列百分比結(jié)果
local rn:rowsof ftable
mat cper=ftable\*syminv(diag(ftable[`rn',1...]))
mat coljoin ctable=ftable cper
同理,得到列百分比矩陣cper和含列百分比的結(jié)果矩陣ctable:
注意:ftable\*syminv(diag(ftable[
rn',1...]))`乘數(shù)位置和行百分比矩陣不同高镐!
第四部分:結(jié)果導(dǎo)出excel
// 行百分比結(jié)果導(dǎo)出excel
putexcel a`rownums'=matrix(rtable),names txtwrap
local rntable:rowsof rtable
local rownume=`rownums'+`rntable'
// 設(shè)置格式
putexcel `cns'`rownums':`cne'`rownume',nformat(#.00%)
local rownums=`rownums'+`rntable'+2
目的:將含行百分比結(jié)果導(dǎo)出Excel
第1句:見矩陣rtable導(dǎo)出Excel溉旋,從單元格A1(開始循環(huán)時(shí),暫元rownums
為1)導(dǎo)出嫉髓;
第2句:將矩陣rtable的行數(shù)存至?xí)涸?code>rntable观腊,示例為3;
第3句:將暫元rownums
(結(jié)果表開始行數(shù))加上暫元rntable
(結(jié)果表行數(shù))得到暫元rownume
算行,即結(jié)果表的結(jié)束行數(shù)梧油;
第4句:將百分比設(shè)為保留兩位小數(shù)的百分?jǐn)?shù)格式,示例單元格范圍是E1:H4
第5句:更新暫元rownums
州邢,即下一個(gè)結(jié)果表開始行數(shù)儡陨;
// 列百分比結(jié)果導(dǎo)出excel
putexcel a`rownums'=matrix(ctable),names txtwrap
local rntable:rowsof ctable
local rownume=`rownums'+`rntable'
// 設(shè)置格式
putexcel `cns'`rownums':`cne'`rownume',nformat(#.00%)
local rownums=`rownums'+`rntable'+2
同理,將含列百分比結(jié)果導(dǎo)出Excel
4.最后效果
跑上述代碼的效果(行變量:P4Q17 P2Q1 P4Q10;列變量:P4Q3 P4Q6 P4Q7 P4Q8)后:
共得到3*4=12個(gè)交叉結(jié)果骗村,每個(gè)交叉結(jié)果都呈現(xiàn)含行百分比和列百分比的結(jié)果表:
5. 補(bǔ)充
根據(jù)實(shí)際需求修改嫌褪,只呈現(xiàn)行百分比或者列百分比,最終可實(shí)現(xiàn)批量導(dǎo)出多份數(shù)據(jù)的多個(gè)變量的交叉分析結(jié)果~
預(yù)期接下來:
stata結(jié)果導(dǎo)入excel-描述統(tǒng)計(jì)
stata結(jié)果導(dǎo)入excel-方差分析