Как заставить Stata сообщать об нулях в табличном виде - PullRequest
3 голосов
/ 15 февраля 2011

Я пытаюсь использовать команду tabulate в Stata для создания временного ряда частот. Проблема возникает, когда я пытаюсь объединить вывод tabulate после выполнения каждой даты. tabulate не будет включать 0 в качестве записи, если не существует наблюдения для значения рассматриваемой переменной. Например, если бы я хотел посчитать 10, 11 и 12 лет в классе за трехлетний период, Stata мог бы вывести (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;

Ответы [ 3 ]

2 голосов
/ 31 января 2013

Эта проблема решена с помощью tabcount.См. Статью 2003 года

http://www.stata -journal.com / article.html? Article = pr0011

и загрузите программный код и файлы справки после получения ссылки поsearch tabcount.

2 голосов
/ 15 февраля 2011

То, что вы хотите, не является опцией команды 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-")
0 голосов
/ 16 февраля 2011

Это решение, которое я использовал.Возможно, Кит лучше, и я буду исследовать его решение в будущем.

Я сохранил метки строк (используя 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');
};
...