-
Notifications
You must be signed in to change notification settings - Fork 0
/
cuentacot.ado
344 lines (266 loc) · 11 KB
/
cuentacot.ado
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
// vers 0.1.1 diciembre 2011, George Vega Yon
capture program drop cuentacot
program cuentacot, nclass sortpreserve
/* Este programa cuenta número de cotizaciones continuas/descontinuas en un
periodo establecido para cada uno de los individuos en función de los pará_
metros establecidos en las opciones del programa.
*/
vers 9
#delimit ;
syntax
varlist (min=2 max=3)
, [DIScontinuas
CONTinuas
CONTEMPleador
EMPleador
MENNCont
MENNDiscont
Keep
NCot(integer 12)
NPer(integer 24)
NSolic(varname)
TIpcon(varname)];
#delimit cr
tokenize `varlist'
local time_name `1' /* Define la variable de tiempo de referencia */
local id_per `2' /* Id individuo */
local id_emp `3' /* Id empleador */
// Para mantener el orden
tempvar orden
gen `orden' = _n
cap conf existence `nsolic'
local exists = _rc
if (`exists' == 6) { // Verifica la existencia de la variable
tempvar nsolic
qui gen byte `nsolic' = .
local extraper = 0
sort `orden'
}
else {
// En el caso de que existan solicitudes, se encuentra el N max de solici
// con la finalidad de, al momento de expandir los datos, agregar tantas
// observaciones como solicitudes existan.
tempvar extraper0
tempvar extraper1
quietly {
bysort `nsolic': gen `extraper0' = _N if `nsolic' != .
egen `extraper1' = max(`extraper0')
}
local extraper = `extraper1'
drop `extraper0' `extraper1'
sort `orden'
}
cap conf existence `tipcon'
local exists = _rc
if (`exists' == 6) { // Verifica la existencia de la variable
tempvar tipcon
gen byte `tipcon' = 1
}
cap conf existence `id_emp'
local exists = _rc
if (`exists' == 6) { // Verifica la existencia de la variable
tempvar id_emp
gen byte `id_emp' = 1
}
tempvar tiempo_continuo /* Define la variable de tiempo continuo a utilizar */
local cuenta_tot cuenta_cot_dis
local cuenta_con cuenta_cot_cont
local cuenta_con_emp cuenta_cot_cont_emp
local cuenta_m_en_n_cont cuenta_cot_`ncot'_en_`nper'_cont
local cuenta_m_en_n_dis cuenta_cot_`ncot'_en_`nper'_dis
local cuenta_ult_con_emp cuenta_`ncot'_ult_cot_emp
local cot_cont cotiza_continuas`ncot'
local cot_m_en_n_cont cot_`ncot'_en_`nper'_cont
local cot_m_en_n_dis cot_`ncot'_en_`nper'_dis
local cot_n_emp_dis cot_`ncot'_emp_dis
local cot_n_emp_cont cot_`ncot'_emp_cont
local var_cuenta "`cuenta_tot' `cuenta_con' `cuenta_con_emp' `cuenta_m_en_n_cont' `cuenta_m_en_n_dis' `cuenta_ult_con_emp'"
local var_bool "`cot_cont' `cot_m_en_n_cont' `cot_m_en_n_dis' `cot_n_emp_dis'"
****************************************************************************
* Contador de tiempo
dis _newline
dis _column(4) "Contador de cotizaciones"
dis _column(4) "Fecha de inicio `c(current_date)' - `c(current_time)'"
dis _column(4) as text "{hline 30}
dis _column(4) "Preparando variable de tiempo"
quietly{
gen int `tiempo_continuo' = floor(`time_name'/100)*12
replace `tiempo_continuo' = `tiempo_continuo' + /*
*/ `time_name' - `tiempo_continuo'/12*100
sort `id_per' `tiempo_continuo' `id_emp' `tipcon' `nsolic', stable
}
dis _column(6) "Finalizado..."
****************************************************************************
if (length("`discontinuas'") != 0) {
* Contador de Cotizaciones discontinuas
dis _column(4) "Calculando cotizaciones discontinuas"
quietly {
cap drop `cuenta_tot'
gen byte `cuenta_tot' = 1
by `id_per': replace `cuenta_tot' = `cuenta_tot'[_n - 1] + 1 /*
*/ *(`tiempo_continuo'[_n] != `tiempo_continuo'[_n - 1])*(`nsolic'[_n] == .) ///
if _n > 1 & (`nsolic'[_n - 1] == .)
}
dis _column(6) "Finalizado..."
}
if (length("`continuas'") != 0) {
* Contador de Cotizaciones continuas
dis _column(4) "Calculando cotizaciones continuas"
quietly {
cap drop `cuenta_con'
gen byte `cuenta_con' = 1
by `id_per': replace `cuenta_con' = `cuenta_con'[_n - 1] + 1 /*
*/ * (`tiempo_continuo'[_n - 1] + 1 == `tiempo_continuo'[_n]) /*
*/ * (`nsolic' == .) if _n > 1 & ///
(`tiempo_continuo'[_n] - `tiempo_continuo'[_n - 1] < 2) & ///
(`nsolic'[_n] != . & `nsolic'[_n - 1] == . | ///
`nsolic'[_n] == . & `nsolic'[_n - 1] == . | ///
`nsolic'[_n] != . & `nsolic'[_n - 1] != .) & ///
(`tipcon'[_n] == `tipcon'[_n - 1])
cap drop `cot_cont'
gen byte `cot_cont' = `cuenta_con' >= `ncot'
}
dis _column(6) "Finalizado..."
}
****************************************************************************
* Contador de Cotizaciones continuas con el mismo empleador
if (length("`contempleador'") != 0) {
dis _column(4) "Calculando cotizaciones continuas con el mismo empleador"
quietly {
cap drop `cuenta_con_emp'
sort `id_per' `id_emp' `tiempo_continuo', stable
gen byte `cuenta_con_emp' = 1
by `id_per' `id_emp': replace `cuenta_con_emp' = `cuenta_con_emp'[_n - 1] + 1 /*
*/ * (`tiempo_continuo'[_n - 1] + 1 == `tiempo_continuo'[_n])*(`nsolic' == .) ///
if _n > 1 & ///
(`tiempo_continuo'[_n] - `tiempo_continuo'[_n - 1] < 2) & ///
(`nsolic'[_n] != . & `nsolic'[_n - 1] == . | ///
`nsolic'[_n] == . & `nsolic'[_n - 1] == . | ///
`nsolic'[_n] != . & `nsolic'[_n - 1] != .) & ///
(`tipcon'[_n] == `tipcon'[_n - 1])
cap drop `cot_n_emp_cont'
gen byte `cot_n_emp_cont' = `cuenta_con_emp' >= `ncot'
// Vuelve al orden necesario
sort `id_per' `tiempo_continuo' `id_emp' `tipcon' `nsolic', stable
}
dis _column(6) "Finalizado..."
}
****************************************************************************
* Contador de "m" últimas cotizaciones con el mismo empleador
if (length("`empleador'") != 0) {
dis _column(4) "Calculando las `ncot' cotizaciones discontinuas con el mismo empleador"
quietly {
cap drop `cuenta_ult_con_emp'
gen byte `cuenta_ult_con_emp' = 1
sort `id_per' `id_emp' `tiempo_continuo', stable
by `id_per' `id_emp': replace `cuenta_ult_con_emp' = `cuenta_ult_con_emp'[_n - 1] ///
+ 1 * (`tiempo_continuo'[_n - 1] != `tiempo_continuo'[_n] & `nsolic'[_n] == .) if _n > 1 & ///
`tipcon'[_n] == `tipcon'[_n - 1]
cap drop `cot_n_emp_dis'
gen byte `cot_n_emp_dis' = `cuenta_ult_con_emp' >= `ncot'
// Vuelve al orden necesario
sort `id_per' `tiempo_continuo' `id_emp' `tipcon' `nsolic', stable
}
dis _column(6) "Finalizado..."
}
****************************************************************************
* Contadores Con periodos
local nper2 = `nper' - 1 + `extraper'
if (length("`menncont'") != 0 | length("`menndiscont'") != 0) {
dis _column(4) "Determinando periodos válidos para cuentas en periodos"
quietly {
forval i = `nper2'(-1)0 {
tempvar tiempo_continuo`i'
by `id_per': gen int `tiempo_continuo`i'' = `tiempo_continuo'[_n - `i']
tempvar nsolic`i'
by `id_per': gen `nsolic`i'' = `nsolic'[_n - `i']
}
* Prepara variables para validar últimos periodos
tempvar ult_periodo_valido
gen byte `ult_periodo_valido' = 0
// Marca de periodos válidos de 0 a `nper'
forval i = 1/`nper2' {
replace `ult_periodo_valido' = `i' if ///
(`tiempo_continuo0' - `tiempo_continuo`i'') + 1 <= `nper' & ///
`nsolic' == . & `nsolic`i'' == .
}
}
dis _column(6) "Finalizado..."
}
if (length("`menncont'") != 0) {
dis _column(4) "Calculando `ncot' cotizaciones continuas en los últimos `nper' periodos"
quietly {
cap drop `cuenta_m_en_n_cont'
gen byte `cuenta_m_en_n_cont' = 1
// Comparando entremedio
tempvar cuenta_m_en_n_cont2
gen byte `cuenta_m_en_n_cont2' = 1
forval i = `nper2'(-1)1 {
local j = `i' - 1
// Cuenta de periodos continuos
replace `cuenta_m_en_n_cont' = (`cuenta_m_en_n_cont' + ///
(`tiempo_continuo`i'' == `tiempo_continuo`j''- 1))*(`nsolic`j'' == .) if ///
`i' <= `ult_periodo_valido'
replace `cuenta_m_en_n_cont2' = max(`cuenta_m_en_n_cont', `cuenta_m_en_n_cont2') if ///
(`nsolic`j'' == .)
}
// Reemplaza por el máximo encontrado
replace `cuenta_m_en_n_cont' = `cuenta_m_en_n_cont2'
// En el caso de que sea multicot
by `id_per': replace `cuenta_m_en_n_cont' = `cuenta_m_en_n_cont' + ///
(`tiempo_continuo' == `tiempo_continuo'[_n - 1] & `tiempo_continuo' != `tiempo_continuo'[_n+1])
// En el caso de que sea solicitudes al seguro
by `id_per': replace `cuenta_m_en_n_cont' = `cuenta_m_en_n_cont'[_n - 1] if `nsolic'[_n] != .
cap drop `cot_m_en_n_cont'
gen byte `cot_m_en_n_cont' = `cuenta_m_en_n_cont' >= `ncot'
}
dis _column(6) "Finalizado..."
}
if (length("`menndiscont'") != 0) {
dis _column(4) "Calculando `ncot' cotizaciones discontinuas en los últimos `nper' periodos"
quietly {
cap drop `cuenta_m_en_n_dis'
gen byte `cuenta_m_en_n_dis' = 1
forval i = `nper2'(-1)1 {
local j = `i' - 1
replace `cuenta_m_en_n_dis' = `cuenta_m_en_n_dis'*(`nsolic`j'' == .) + ///
(`tiempo_continuo`i'' != `tiempo_continuo`j'')*(`nsolic`j'' == .) ///
if `i' <= `ult_periodo_valido'
}
// En el caso de que sea multicot
by `id_per': replace `cuenta_m_en_n_dis' = `cuenta_m_en_n_dis' + ///
(`tiempo_continuo' == `tiempo_continuo'[_n - 1] & `tiempo_continuo' != `tiempo_continuo'[_n+1])
// En el caso de que sea solicitudes al seguro
replace `cuenta_m_en_n_dis' = `cuenta_m_en_n_dis'[_n - 1] if `nsolic' != .
cap drop `cot_m_en_n_dis'
gen byte `cot_m_en_n_dis' = `cuenta_m_en_n_dis' >= `ncot'
}
dis _column(6) "Finalizado..."
}
// Cierre
if (length("`keep'") == 0) {
cap drop `cuenta_con'
cap drop `cuenta_m_en_n_cont'
cap drop `cuenta_m_en_n_dis'
cap drop `cuenta_ult_con_emp'
}
else {
foreach var of local var_cuenta {
cap compress `var'
}
}
foreach var of local var_bool {
cap compress `var'
}
cap la var `cuenta_tot' "Contador de Cotizaciones discontinuas"
cap la var `cuenta_con' "Contador de Cotizaciones continuas"
cap la var `cuenta_con_emp' "Contador de Cotizaciones continuas con el mismo empleador"
cap la var `cuenta_m_en_n_cont' "`ncot' cotizaciones continuas en los últimos `nper' periodos"
cap la var `cuenta_m_en_n_dis' "`ncot' cotizaciones discontinuas en los últimos `nper' periodos"
cap la var `cuenta_ult_con_emp' "`ncot' cotizaciones con el mismo empleador en los últimos `nper' periodos"
cap la var `cot_cont' "1 si observación cuenta con `ncot' cotizaciones continuas."
cap la var `cot_m_en_n_cont' "1 si observación cuenta con `ncot' cotiza cont. en últ `nper' per"
cap la var `cot_m_en_n_dis' "1 si observación cuenta con `ncot' cotiza discont. en últ `nper' per"
cap la var `cot_n_emp_dis' "1 si observación cuenta con `ncot' cotiza discont con el mismo emp en últ `nper' per"
dis _column(4) "Fecha de término `c(current_date)' - `c(current_time)'"
end