2016-08-08 3 views
1

Ich versuche, eine Dummy-Variable zu erstellen, um die nächsten fünf Beobachtungen nach einer Auswahl von Cutoffs zu identifizieren. Die erste Methode im folgenden Code funktioniert, aber sie sieht ein bisschen chaotisch aus und ich möchte die Anzahl der Beobachtungen, für die ich Dummies erzeuge, anpassen können, ohne den gleichen Ausdruck 30 Mal eingeben zu müssen (normalerweise ein Zeichen, dass ich bin) etwas auf die harte Tour machen).Fehler beim Schleifen mit Makros in der Indizierung

Jedes Mal, wenn ich einen Makro in die Indexierungs setzen, das heißt

[_n-`i'] 

bekomme ich folgende Fehlermeldung:

_= invalid name 
r(198); 

ich für ein paar Ratschläge sehr dankbar sein würde.

sysuse auto.dta, replace 
global cutoffs 3299 4424 5104 5788 10371 

Dies funktioniert

sort price 
gen A=0 

foreach x in $cutoffs { 
    replace A=1 if price==`x' 
    replace A=1 if price[_n-1]==`x' 
    replace A=1 if price[_n-2]==`x' 
    replace A=1 if price[_n-3]==`x' 
    replace A=1 if price[_n-4]==`x' 
    replace A=1 if price[_n-5]==`x' 
} 

Dies gilt nicht.

foreach x in $cutoffs { 
    forval `i' = 0/25 { 
     replace A=1 if price[_n-`i']==`x' 
    } 
} 

Irgendwelche Ratschläge warum?

Antwort

1

In Stata-Begriffen werden hier überhaupt keine Schleifen benötigt, außer den stillschweigend in generate und replace. Sie wollen einen Zähler setzen jedes Mal gehen sofort, nachdem Sie einen Cutoff-Hit, und dann Zählerwerte zwischen 1 und 5 Hier einige Technik identifizieren:

sysuse auto.dta, clear 
global cutoffs 3299,4424,5104,5788,10371 
sort price 

gen counter = 0 if inlist(price, $cutoffs) 
replace counter = counter[_n-1] + 1 if missing(counter) 
gen wanted = inrange(counter, 1, 5) 

list price counter wanted 

    +---------------------------+ 
    | price counter wanted | 
    |---------------------------| 
    1. | 3,291   .  0 | 
    2. | 3,299   0  0 | 
    3. | 3,667   1  1 | 
    4. | 3,748   2  1 | 
    5. | 3,798   3  1 | 
    |---------------------------| 
    6. | 3,799   4  1 | 
    7. | 3,829   5  1 | 
    8. | 3,895   6  0 | 
    9. | 3,955   7  0 | 
10. | 3,984   8  0 | 
    |---------------------------| 
11. | 3,995   9  0 | 
12. | 4,010  10  0 | 
13. | 4,060  11  0 | 
14. | 4,082  12  0 | 
15. | 4,099  13  0 | 
    |---------------------------| 
16. | 4,172  14  0 | 
17. | 4,181  15  0 | 
18. | 4,187  16  0 | 
19. | 4,195  17  0 | 
20. | 4,296  18  0 | 
    |---------------------------| 
21. | 4,389  19  0 | 
22. | 4,424   0  0 | 
23. | 4,425   1  1 | 
24. | 4,453   2  1 | 
25. | 4,482   3  1 | 
    |---------------------------| 
26. | 4,499   4  1 | 
27. | 4,504   5  1 | 
28. | 4,516   6  0 | 
29. | 4,589   7  0 | 
30. | 4,647   8  0 | 
    |---------------------------| 
31. | 4,697   9  0 | 
32. | 4,723  10  0 | 
33. | 4,733  11  0 | 
34. | 4,749  12  0 | 
35. | 4,816  13  0 | 
    |---------------------------| 
36. | 4,890  14  0 | 
37. | 4,934  15  0 | 
38. | 5,079  16  0 | 
39. | 5,104   0  0 | 
40. | 5,172   1  1 | 
    |---------------------------| 
41. | 5,189   2  1 | 
42. | 5,222   3  1 | 
43. | 5,379   4  1 | 
44. | 5,397   5  1 | 
45. | 5,705   6  0 | 
    |---------------------------| 
46. | 5,719   7  0 | 
47. | 5,788   0  0 | 
48. | 5,798   1  1 | 
49. | 5,799   2  1 | 
50. | 5,886   3  1 | 
    |---------------------------| 
51. | 5,899   4  1 | 
52. | 6,165   5  1 | 
53. | 6,229   6  0 | 
54. | 6,295   7  0 | 
55. | 6,303   8  0 | 
    |---------------------------| 
56. | 6,342   9  0 | 
57. | 6,486  10  0 | 
58. | 6,850  11  0 | 
59. | 7,140  12  0 | 
60. | 7,827  13  0 | 
    |---------------------------| 
61. | 8,129  14  0 | 
62. | 8,814  15  0 | 
63. | 9,690  16  0 | 
64. | 9,735  17  0 | 
65. | 10,371   0  0 | 
    |---------------------------| 
66. | 10,372   1  1 | 
67. | 11,385   2  1 | 
68. | 11,497   3  1 | 
69. | 11,995   4  1 | 
70. | 12,990   5  1 | 
    |---------------------------| 
71. | 13,466   6  0 | 
72. | 13,594   7  0 | 
73. | 14,500   8  0 | 
74. | 15,906   9  0 | 
    +---------------------------+ 

In der Tat, Ihr Text sagt „die nächsten fünf Beobachtungen nach“ aber dein Code implementiert nicht nur das, sondern auch die Cutoff-Beobachtung. Für Letzteres verwenden Sie inrange(counter, 0, 5).

Verständnis der Prinzipien here ist entscheidend für diese Frage.

Für inrange() und inlist() siehe ihre Hilfe Einträge und/oder this paper.

Also, was hast du falsch gemacht?

Diese Linie

forval `i' = 0/25 { 

in illegal, wenn Sie zuvor den lokalen Makro i (und ziemlich seltsam Stil selbst dann) definiert haben. Sie meinen vielleicht

forval i = 0/25 { 

obwohl, wo die 25 herkommt, da Ihre Problemstellung, mir unklar ist. Die Fehlermeldung ist nicht besonders hilfreich, aber Stata hat Schwierigkeiten, Code mit einem Loch darin zu verstehen, da das von Ihrem Code implizierte lokale Makro nicht definiert ist.