我正在尝试在Stata中使用tabulate
命令创建一个时间序列的频率。当我尝试在每个日期之后组合tabulate
的输出时出现问题。如果对所讨论的变量的值没有观察,则tabulate
将不包括0作为条目。例如,如果我想计算一个班级中的10岁,11岁和12岁的人在三年内计算,如果只有一个团体被代表,那么Stata可能输出(8)因此我们不知道哪个团体是8个学生属于:可能是(0,8,0)或(0,0,8)。
如果时间序列很短,则这不是问题,因为“结果”窗口显示哪些类别是或未表示。我的数据时间序列要长得多。有没有人知道强制Stata在这些表格中包含零的解决方案/方法?我的代码的相关部分如下:
# delimit;
set more off;
clear;
matrix drop _all;
set mem 1200m;
cd ;
global InputFile "/Users/.../1973-2010.dta";
global OutputFile "/Users/.../results.txt";
use $InputFile;
compress;
log using "/Users/.../log.txt", append;
gen yr_mn = ym(year(datadate), month(datadate));
la var yr_mn "Year-Month Date"
xtset, clear;
xtset id datadate, monthly;
/*Converting the Ratings Scale to Numeric*/;
gen LT_num = .;
replace LT_num = 1 if splticrm=="AAA";
replace LT_num = 2 if (splticrm=="AA"||splticrm=="AA+"||splticrm=="AA-");
replace LT_num = 3 if (splticrm=="A"||splticrm=="A+"||splticrm=="A-");
replace LT_num = 4 if (splticrm=="BBB"||splticrm=="BBB+"||splticrm=="BBB-");
replace LT_num = 5 if (splticrm=="BB"||splticrm=="BB+"||splticrm=="BB-");
replace LT_num = 6 if (splticrm=="B"||splticrm=="B+"||splticrm=="B-");
replace LT_num = 7 if (splticrm=="CCC"||splticrm=="CCC+"||splticrm=="CCC-");
replace LT_num = 8 if (splticrm=="CC");
replace LT_num = 9 if (splticrm=="SD");
replace LT_num = 10 if (splticrm=="D");
summarize(yr_mn);
local start = r(min);
local finish = r(max);
forv x = `start'/`finish' {;
qui tab LT_num if yr_mn == `x', matcell(freq_`x');
};
log close;
答案 0 :(得分:2)
您想要的不是tab
命令的选项。如果要将结果显示在屏幕上,您可以成功使用table ..., missing
。
您可以尝试以下操作,而不是循环,我认为这将适用于您的目的:
preserve
gen n = 1 // (n could be a variable that indicates if you want to include the row or not; or just something that never ==.)
collapse (count) n , by(LT_num yr_mn)
reshape wide n, i(yr_mn) j(LT_num)
mkmat _all , matrix(mymatname)
restore
mat list mymatname
我认为这就是你要追求的目标(但不能告诉你如何使用你想要生成的矩阵)。
P.S。我更喜欢将inlist
函数用于以下内容:
replace LT_num = 2 if inlist(splticrm,"AA","AA+","AA-")
答案 1 :(得分:2)
tabcount
解决了这个问题。见2003年论文
http://www.stata-journal.com/article.html?article=pr0011
并在search tabcount
获取链接后下载程序代码和帮助文件。
答案 2 :(得分:0)
这是我使用的解决方案。 Keith可能会更好,我将在未来探索他的解决方案。
我将行标签(使用matrow)保存在向量中,并将其用作初始化为零的正确维度的矩阵的索引。这样我就可以将每个频率放在正确位置的矩阵中,并保留所有零。在“local finish = r(max)”之后,解决方案遵循上面的代码。 [请注意,我包含一个计数器,用于消除此变量为空的第一个观察结果。]
local counter=0;
forv x = `first'/`last' {;
tab LT_num if yr_mn == `x', matrow(index_`x') matcell(freq_`x');
local rows = r(r); /*r(r) is number of rows for tabulate*/;
if `rows'!=0{;
matrix define A_`x'=J(10,1,0);
forv r=1/`rows'{;
local a=index_`x'[`r',1];
matrix define A_`x'[`a',1]=freq_`x'[`r',1];
};
};
else {;
local counter=`counter'+1;
};
};
local start=`first'+`counter'+1;
matrix define FREQ = freq_`start';
forv i = `start'/`last' {;
matrix FREQ = (FREQ,A_`i');
};