Убедитесь, что данные постоянны в группе - PullRequest
1 голос
/ 02 марта 2020

Мне часто приходится проверять, являются ли переменные постоянными в группе. Вот как я сейчас go об этом (предположим, что группа определяется как ab- c, а рассматриваемая переменная - var):

bys a b c (var): gen isconstant=var[1]==var[_N]
*manually inspect the results of the below tabulation; if all 1's, then it is constant
tab isconstant
drop isconstant

(Обратите внимание, что в приведенном выше подходе предполагается, что нет пропущенных наблюдений внутри группы. Мне нужно больше думать о том, как подойти к нему, если бы были пропуски. И вместо ручной проверки, можно использовать что-то вроде assert.)

Это работает хорошо, но есть ли более лаконичный способ сделать это? Возможно однострочное решение, примерно аналогичное isid ..., но, конечно, проверка чего-то другого.

1 Ответ

1 голос
/ 02 марта 2020

Принцип вашего подхода также объясняется в этом FAQ , но я не знаю о выделенной команде. Тем не менее, это программируемый, а вы программист, так где ваш?

Вот быстрый удар:

*! 1.0.0 NJC 2 March 2020 
program homog, sortpreserve 
    version 8 
    syntax varname [if] [in] [, MISSing BY(varlist) ] 

    * missings are ignored by default
    if "`missing'" == "" { 
        marksample touse, strok  
        if "`by'" != "" markout `touse' `by', strok 
    }
    else marksample touse, novarlist 

    tempvar OK 
    bysort `touse' `by' (`varlist') : gen byte `OK' = `varlist'[1] == `varlist'[_N] 

    quietly summarize `OK' if `touse' 

    if r(min) == 0 display as err "assertion is false" 
end 

и несколько глупых примеров:

. sysuse auto, clear
(1978 Automobile Data)

. homog mpg
assertion is false

. homog rep78, by(rep78)

. gen one = 1

. homog one

. replace one = . in L
(1 real change made, 1 to missing)

. homog one

. homog one, missing
assertion is false

Итак, принципы:

  1. Нет новостей, это хорошие новости. Единственным возможным выходом, кроме сообщений об ошибках, является сообщение «утверждение ложно». Это не рассматривается как ошибка. Если ваш вкус работает иначе, клонируйте программу, переименуйте ее и измените способ ее работы.

  2. by() является опцией, и, если она указана, все сравнения будут проводиться по отдельным группам наблюдений, идентифицированным таким образом.

  3. Пропуски по умолчанию игнорируются. Опция missing изменяет это так, что, например, 42 и отсутствующие сообщаются как разные. Это относится также к пропущенным значениям любых by() переменных.

...