Select 如何从变量中采样项目
我有一个大的不平衡面板数据集,如下所示:Select 如何从变量中采样项目,select,random,subset,stata,sample,Select,Random,Subset,Stata,Sample,我有一个大的不平衡面板数据集,如下所示: clear input year id income 2003 513 500 2003 517 500 2003 518 100 2003 525 900 2003 528 800 2003 531 0 2003 532 300 2003 534 600 2004 513 1000 2004 517 120 2004 523 300 2004 525 700 2004 528 800 2004 531 200 2004 532 600 2004 53
clear
input year id income
2003 513 500
2003 517 500
2003 518 100
2003 525 900
2003 528 800
2003 531 0
2003 532 300
2003 534 600
2004 513 1000
2004 517 120
2004 523 300
2004 525 700
2004 528 800
2004 531 200
2004 532 600
2004 534 100
end
我想通过id
随机抽样一些人id
范围在正自然数中有间隙(最小513
和最大287321
,但也有一些面板缺失,即514
,515
,516
)
我需要保留数据的面板功能。因此,如果选择了随机id,则必须保留任何年份id组合。我不需要随机抽样的数据(既不是10%也不是10次观察)。相反,我对id列/变量中的随机id号感兴趣,它以一种我可以随后使用的方式存储
因此,我正在寻找类似“从列ID的给定值集中选择一个随机值”的命令。我随后希望在命令中使用此随机选取的id,例如:
xtline income if id==X
它应该显示随机人/ID X的全年收入。获得您想要的东西的一种方法是:
clear
input year id var
2003 513 5
2003 517 5
2003 523 6
2003 525 9
2003 528 8
2003 531 0
2003 532 3
2003 534 6
2004 513 10
2004 517 12
2004 523 3
2004 525 7
2004 528 8
2004 531 2
2004 532 6
2004 534 1
end
bysort year (id): sample 3, count
list, sepby(year)
+------------------+
| year id var |
|------------------|
1. | 2003 523 6 |
2. | 2003 534 6 |
3. | 2003 531 0 |
|------------------|
4. | 2004 517 12 |
5. | 2004 523 3 |
6. | 2004 532 6 |
+------------------+
要对10%
进行采样,您需要去掉count
选项:
bysort year (id): sample 10
编辑: 要在所有面板中随机选择相同的观察结果:
设置种子12345
生成random=runiform()
bysort id:replace random=random[1]
如果随机<0.1,则保留
分拣年份(id)
列表,年月日
+-----------------------------+
|年份id var随机|
|-----------------------------|
1. | 2003 523 6 .0039323 |
2. | 2003 532 3 .0286627 |
|-----------------------------|
3. | 2004 523 3 .0039323 |
4. | 2004 532 6 .0286627 |
+-----------------------------+
获得您想要的东西的一种方法是:
clear
input year id var
2003 513 5
2003 517 5
2003 523 6
2003 525 9
2003 528 8
2003 531 0
2003 532 3
2003 534 6
2004 513 10
2004 517 12
2004 523 3
2004 525 7
2004 528 8
2004 531 2
2004 532 6
2004 534 1
end
bysort year (id): sample 3, count
list, sepby(year)
+------------------+
| year id var |
|------------------|
1. | 2003 523 6 |
2. | 2003 534 6 |
3. | 2003 531 0 |
|------------------|
4. | 2004 517 12 |
5. | 2004 523 3 |
6. | 2004 532 6 |
+------------------+
要对10%
进行采样,您需要去掉count
选项:
bysort year (id): sample 10
编辑: 要在所有面板中随机选择相同的观察结果:
设置种子12345
生成random=runiform()
bysort id:replace random=random[1]
如果随机<0.1,则保留
分拣年份(id)
列表,年月日
+-----------------------------+
|年份id var随机|
|-----------------------------|
1. | 2003 523 6 .0039323 |
2. | 2003 532 3 .0286627 |
|-----------------------------|
3. | 2004 523 3 .0039323 |
4. | 2004 532 6 .0286627 |
+-----------------------------+
至少在一开始没有很好地解释这一点,但我认为您希望随机选择面板。下面的方法随机选择第一个观察值,然后将任何选择扩展到整个面板。它没有考虑任何小组的观察次数。用-1标记一个选择只是一个次要的设备,这样所选的观察结果就可以提前排序。幻数5——替换为任意幻数的面板——是所选面板的数量(不是百分比),这是您所要求的
clear
input float(year id income)
2003 513 500
2004 513 1000
2003 517 500
2004 517 120
2003 518 100
2004 523 300
2003 525 900
2004 525 700
2003 528 800
2004 528 800
2003 531 0
2004 531 200
2003 532 300
2004 532 600
2003 534 600
2004 534 100
end
list, sepby(id)
+---------------------+
| year id income |
|---------------------|
1. | 2003 513 500 |
2. | 2004 513 1000 |
|---------------------|
3. | 2003 517 500 |
4. | 2004 517 120 |
|---------------------|
5. | 2003 518 100 |
|---------------------|
6. | 2004 523 300 |
|---------------------|
7. | 2003 525 900 |
8. | 2004 525 700 |
|---------------------|
9. | 2003 528 800 |
10. | 2004 528 800 |
|---------------------|
11. | 2003 531 0 |
12. | 2004 531 200 |
|---------------------|
13. | 2003 532 300 |
14. | 2004 532 600 |
|---------------------|
15. | 2003 534 600 |
16. | 2004 534 100 |
+---------------------+
bysort id : gen byte first = -(_n == 1)
set seed 1776
gen rnd = runiform()
sort first rnd
gen wanted = _n <= 5
bysort id (wanted) : replace wanted = wanted[_N]
sort id year
list id year if wanted, sepby(id)
+------------+
| id year |
|------------|
7. | 525 2003 |
8. | 525 2004 |
|------------|
9. | 528 2003 |
10. | 528 2004 |
|------------|
11. | 531 2003 |
12. | 531 2004 |
|------------|
13. | 532 2003 |
14. | 532 2004 |
|------------|
15. | 534 2003 |
16. | 534 2004 |
+------------+
清除
投入浮动(年度id收入)
2003 513 500
2004 513 1000
2003 517 500
2004 517 120
2003 518 100
2004 523 300
2003 525 900
2004 525 700
2003 528 800
2004 528 800
2003 531 0
2004 531 200
2003 532 300
2004 532 600
2003 534 600
2004 534 100
结束
列表,sepby(id)
+---------------------+
|年度id收入|
|---------------------|
1. | 2003 513 500 |
2. | 2004 513 1000 |
|---------------------|
3. | 2003 517 500 |
4. | 2004 517 120 |
|---------------------|
5. | 2003 518 100 |
|---------------------|
6. | 2004 523 300 |
|---------------------|
7. | 2003 525 900 |
8. | 2004 525 700 |
|---------------------|
9. | 2003 528 800 |
10. | 2004 528 800 |
|---------------------|
11. | 2003 531 0 |
12. | 2004 531 200 |
|---------------------|
13. | 2003 532 300 |
14. | 2004 532 600 |
|---------------------|
15. | 2003 534 600 |
16. | 2004 534 100 |
+---------------------+
bysort id:gen byte first=-(\u n==1)
播种1776
gen rnd=符形()
排序优先rnd
gen wanted=\u n这一点没有得到很好的解释,至少一开始是这样,但我认为您希望随机选择面板。下面的方法随机选择第一个观察值,然后将任何选择扩展到整个面板。它没有考虑任何小组的观察次数。用-1标记一个选择只是一个次要的设备,这样所选的观察结果就可以提前排序。幻数5——替换为任意幻数的面板——是所选面板的数量(不是百分比),这是您所要求的
clear
input float(year id income)
2003 513 500
2004 513 1000
2003 517 500
2004 517 120
2003 518 100
2004 523 300
2003 525 900
2004 525 700
2003 528 800
2004 528 800
2003 531 0
2004 531 200
2003 532 300
2004 532 600
2003 534 600
2004 534 100
end
list, sepby(id)
+---------------------+
| year id income |
|---------------------|
1. | 2003 513 500 |
2. | 2004 513 1000 |
|---------------------|
3. | 2003 517 500 |
4. | 2004 517 120 |
|---------------------|
5. | 2003 518 100 |
|---------------------|
6. | 2004 523 300 |
|---------------------|
7. | 2003 525 900 |
8. | 2004 525 700 |
|---------------------|
9. | 2003 528 800 |
10. | 2004 528 800 |
|---------------------|
11. | 2003 531 0 |
12. | 2004 531 200 |
|---------------------|
13. | 2003 532 300 |
14. | 2004 532 600 |
|---------------------|
15. | 2003 534 600 |
16. | 2004 534 100 |
+---------------------+
bysort id : gen byte first = -(_n == 1)
set seed 1776
gen rnd = runiform()
sort first rnd
gen wanted = _n <= 5
bysort id (wanted) : replace wanted = wanted[_N]
sort id year
list id year if wanted, sepby(id)
+------------+
| id year |
|------------|
7. | 525 2003 |
8. | 525 2004 |
|------------|
9. | 528 2003 |
10. | 528 2004 |
|------------|
11. | 531 2003 |
12. | 531 2004 |
|------------|
13. | 532 2003 |
14. | 532 2004 |
|------------|
15. | 534 2003 |
16. | 534 2004 |
+------------+
清除
投入浮动(年度id收入)
2003 513 500
2004 513 1000
2003 517 500
2004 517 120
2003 518 100
2004 523 300
2003 525 900
2004 525 700
2003 528 800
2004 528 800
2003 531 0
2004 531 200
2003 532 300
2004 532 600
2003 534 600
2004 534 100
结束
列表,sepby(id)
+---------------------+
|年度id收入|
|---------------------|
1. | 2003 513 500 |
2. | 2004 513 1000 |
|---------------------|
3. | 2003 517 500 |
4. | 2004 517 120 |
|---------------------|
5. | 2003 518 100 |
|---------------------|
6. | 2004 523 300 |
|---------------------|
7. | 2003 525 900 |
8. | 2004 525 700 |
|---------------------|
9. | 2003 528 800 |
10. | 2004 528 800 |
|---------------------|
11. | 2003 531 0 |
12. | 2004 531 200 |
|---------------------|
13. | 2003 532 300 |
14. | 2004 532 600 |
|---------------------|
15. | 2003 534 600 |
16. | 2004 534 100 |
+---------------------+
bysort id:gen byte first=-(\u n==1)
播种1776
gen rnd=符形()
排序优先rnd
gen wanted=\n请阅读有关如何改进问题的提示。特别是提供示例数据。非常感谢您的复制