前段时间知道stata16可以直接导入SPSS数据,就把stata16安装了
然后,就想了解stata16的新功能,官方介绍:New in Stata 16
最开始,是里面的Reproducible reporting吸引我,毕竟一直在想着怎么写动态分析报告,即分析结果和报告同步更新。
就研究了一下里面提到的dyndoc
,putexcel
,putword
命令
首先,就是研究了putexcel
命令,想着把频率分析结果能直接导入excel,尤其是有大量变量的时候
简单尝试了一下,发现还是很好用,尤其是导出来中文不会乱码,而且格式自定义,其他命令如logout
,asdoc
等都有各种问题的。
接下来,分不同帖子写写不同分析结果如何批量导出结果至excel,
首先是,频率分析结果导入excel
1. 思路
- 在stata中将频率分析结果形成矩阵(即结果表);
- 再将矩阵导入excel;
- 根据每个矩阵行数,自动在上个矩阵结束后空一行,导入新的矩阵;
- 将变量存成暂元,只需添加变量名,则自动生成新的表;
2. 所有代码
use data_analysis,clear
putexcel set result.xlsx,sheet("单变量",replace) modify
local rownum=1
local rntable=1
local frevar "P4Q3 P4Q6 P4Q7 P4Q8 P4Q9 P4Q10 P4Q11 P4Q1 P4Q2"
foreach var of varlist `frevar'{
fre `var',nov
putexcel A`rownum'="`r(label)'",hcenter vcenter txtwrap bold
mat freq=r(valid)
matrix rownames freq=`r(lab_valid) '
matrix colnames freq="频率"
mat vper=(freq/r(N_valid))
matrix colnames vper="百分比"
mat vtotal=(r(N_valid),1)
matrix rownames vtotal="总计"
matrix colnames vtotal="频率" "百分比"
matrix coljoinbyname table=freq vper
matrix rowjoinbyname table=table vtotal
putexcel A`rownum'=matrix(table),names hcenter vcenter
local rntable:rowsof table
local rownum=`rownum'+`rntable'+2
putexcel c1:C`rownum',nformat(#.00%)
}
3.代码解释
use data_analysis,clear
调用数据
putexcel set result.xlsx,sheet("单变量",replace) modify
在工作目录下生成result.xlsx文件,并在其中生成"单变量"的工作表,重新运行代码时,replace
更新工作表中内容,modify
表示修改excel文件
local rownum=1
local rntable=1
设置初始暂元rownum
和rntable
的值,用于后续循环
local frevar "P4Q3 P4Q6 P4Q7 P4Q8 P4Q9 P4Q10 P4Q11 P4Q1 P4Q2 P4Q16"
将要进行频率分析的变量名存至暂元frevar
中,后续循环中循环这个暂元中的变量就可以进行相同的处理了,这里的变量可以随意增加
foreach var of varlist `frevar'{
开始循环
fre`var',nov
命令fre
需要自行安装,ssc install fre
可以对数值型或者文本型的变量都进行频率分析,novalue
选项表示结果中不显示值,只显示值标签,结果如下:
可以存储值标签或者文本型变量的分类文本,通过输入
return list
可以看到上述命令存储的结果:
其中,r(N)
为样本总量,r(N_valid)
为有效样本量,r(N_missing)
为缺失值数量,r(r)
为总的类别数量,r(r_valid)
为有效值类别数量,r(r_missing)
为缺失值类别数量,r(depvar)
为变量名,r(label)
为变量标签;
r(valid)
为有效样本频率结果矩阵,通过输入matlist r(valid)
可以知道矩阵内容:
有这些结果进行组合就可以生成想要的频率分析结果了~
putexcel A`rownum'="`r(label)'",hcenter vcenter txtwrap bold
由于最开始循环时暂元rownum
为1,所以,表示,在excel的单变量工作表中的A1单元格导入变量标签,hcenter vcenter txtwrap bold
分别表示单元格水平居中,垂直居中,自动换行,以及加粗
mat freq=r(valid)
matrix rownames freq=`r(lab_valid) '
matrix colnames freq="频率"
频率结果矩阵:
第一句:将矩阵r(valid)命名为freq
第二句:将矩阵freq的行名称改为值标签
第三句:将矩阵freq的列名称改为“频率”
结果如下:
mat vper=(freq/r(N_valid))
matrix colnames vper="百分比"
生成百分比矩阵:
第一句:矩阵计算,将矩阵freq除以有效样本量,得到矩阵vper
第二句:把矩阵vper的列名改为”百分比“
结果如下:
mat vtotal=(r(N_valid),1)
matrix rownames vtotal="总计"
matrix colnames vtotal="频率" "百分比"
合计结果矩阵:
第一句:生成矩阵vtotal,该矩阵为1行2列,值分别为有效样本量和1
第二句:将矩阵freq的行名称改为"总计"
第三句:将矩阵freq的列名称改为“频率”和"百分比"
结果如下:
matrix coljoinbyname table=freq vper
matrix rowjoinbyname table=table vtotal
将上述三个矩阵进行拼接:
第一句:矩阵fre和vper进行拼接,增加列数,生成矩阵table
第二句:矩阵table和vtotal进行拼接,增加行数,更新矩阵table
结果如下:
putexcel A`rownum'=matrix(table),names hcenter vcenter
将矩阵table导出到excel中,同上,由于最开始循环时暂元rownum
为1,所以,表示,在excel的单变量工作表中的A1单元格导入矩阵table,names
分别表示将矩阵的行列名称均导出
结果如下:
local rntable:rowsof table
local rownum=`rownum'+`rntable'+2
更新暂元rntable
:将矩阵table的行数存至rntable
中
更新暂元rownum
:将之前的rownum
值加矩阵table的行数再加2,
(例如,循环第一个变量时,rownum
为1,rntable
为3,则此时rownum
为6,循环下一个变量的时候就可以从A6开始导入)
putexcel c1:C`rownum',nformat(#.00%)
将C列,即百分比这列的格式设置为保留两位小数的百分比格式
结果如下:
4.最后效果
跑上述代码的效果(多个变量P4Q3 P4Q6 P4Q7 P4Q8 P4Q9 P4Q10 P4Q11 P4Q1 P4Q2 P4Q16),
5. 补充
根据实际需求修改,最终可实现批量导出多份数据的多个变量的频率结果~
其实,
putexcel
命令stata15就有了,一直没有仔细研究,现在发现这和分析后的存储结果以及矩阵很相关~感觉更理解stata里的矩阵了。-
目前,还体验过的stata16其他功能:
- do文件:自动补全命令;
- 数据编辑窗口:可以手动调节宽度;
- 和python的交互,这样可以用python爬数据后用stata进行统计分析,或者用stata将分析结果导出excel,再用python进行调整;(刚学完python爬数据,到时候再写写stata和python的交互)
- 可以在内存中同时存多个数据,命令
frame
;
预期接下来:
stata结果导入excel-多重响应
stata结果导入excel-交叉分析
stata结果导入excel-描述统计
stata结果导入excel-方差分析