2016-08-08 2 views
1

컷오프 선택 후 다음 다섯 가지 관찰을 식별하는 더미 변수를 만들려고합니다. 아래의 코드에서 첫 번째 방법이 작동하지만 약간 지저분 해 보입니다. 동일한 표현을 30 번 입력하지 않고 인형을 만드는 관측 횟수를 조정할 수 있기를 원합니다 (일반적으로 기호입니다. 어려운 일을하는 것).인덱싱에서 매크로를 반복 할 때 오류가 발생했습니다.

내가 색인에 매크로를 넣을 때마다, 즉

[_n-`i'] 

나는 다음과 같은 오류 얻을 :

_= invalid name 
r(198); 

내가 어떤 조언을 매우 감사하게 될 거라고합니다.

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

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

작동이되지 않습니다.

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

이유에 대한 조언이 있으십니까?

답변

1

generatereplace에 암묵적으로 암시 된 것을 제외하고는 모든 루프가 필요하지 않습니다. 당신은 당신이 차단 충돌 직후마다가는 카운터를 설정 한 다음 1, 여기에 5 사이에 카운터 값을 식별 할 것이 몇 가지 방법입니다 :

사실
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 | 
    +---------------------------+ 

, 텍스트는 말한다 "향후 5 명 관찰 후" 그러나 당신의 코드는 그 것만을 구현하지는 않습니다. 후자의 경우 inrange(counter, 0, 5)을 사용하십시오.

설명 된 원칙을 이해하면 here이이 질문에 중요합니다.

inrange()inlist()은 도움말 항목 및/또는 this paper을 참조하십시오.

그래서, 무엇을 잘못 했습니까?

이 줄

이전에 (그렇다하더라도 오히려 이상한 스타일) 로컬 매크로 i을 정의하지 않는 한 불법에
forval `i' = 0/25 { 

. 너는 아마도 의미가있다.

forval i = 0/25 { 

문제 설명이 주어지면 나에게 불분명하다. 이 오류 메시지는 특별히 도움이되지 않지만 Stata는 코드에서 암시하는 로컬 매크로가 정의되지 않았기 때문에 구멍이있는 코드를 이해하기 위해 고심하고 있습니다.

관련 문제