如何让Stata在表格中报告零

如何让Stata在表格中报告零,stata,Stata,我正在尝试使用Stata中的制表命令来创建频率的时间序列。在运行完每个日期后,当我尝试组合制表的输出时,就会出现问题制表在没有观察到相关变量值时,不会将0作为条目。例如,如果我想在三年的时间里统计一个班级中的10岁、11岁和12岁的学生,如果只代表其中一个小组,那么Stata可能会输出(8),因此我们不知道这8名学生属于哪个小组:它可能是(0,8,0)或(0,0,8) 如果时间序列很短,则这不是问题,因为“结果”窗口显示了哪些类别被表示或未被表示。我的数据有一个更长的时间序列。有人知道有什么解决

我正在尝试使用Stata中的
制表
命令来创建频率的时间序列。在运行完每个日期后,当我尝试组合
制表的输出时,就会出现问题<代码>制表
在没有观察到相关变量值时,不会将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;

您需要的不是带有
选项卡的选项
命令。如果要在屏幕上显示结果,您可以成功地使用
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
我认为这就是你要追求的(但不能告诉你如何使用你试图生成的矩阵)

另外,我更喜欢使用
inlist
函数进行以下操作:

replace LT_num = 2 if inlist(splticrm,"AA","AA+","AA-")

这就是我使用的解决方案。基思的可能更好,我将来会探讨他的解决方案

我将行标签(使用matrow)保存在一个向量中,并将其用作初始化为零的正确维度矩阵的索引。这样我就可以把每个频率放在矩阵的正确位置,并保留所有的零。在“局部光洁度=r(最大值)”之后,解决方案遵循上述代码。[注意,我包括一个计数器,用于消除该变量的第一个空观测值。]

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');
};

此问题由
tabcount
解决。见2003年的文件


通过
search tabcount
获得链接后,下载程序代码和帮助文件

感谢您的快速响应。我已经用inlist替换了所有的条件,它更干净了。