如何从变量中抽样一个项目
How to sample an item from a variable
我有一个很大的不平衡面板数据集,如下所示:
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-column/variable 中的一个随机 ID 号码感兴趣,它以一种我可以随后使用它的方式存储。
因此,我正在寻找像 "pick one random value out of the given set of values from column ID" 这样的命令。我随后想在命令中使用这个随机选择的 id,例如:
xtline income if id==X
应该显示 全年 的随机收入 person/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
编辑:
要在 所有 个面板中随机 select 相同的观察结果:
set seed 12345
generate random = runiform()
bysort id: replace random = random[1]
keep if random < 0.1
sort year (id)
list, sepby(year)
+-----------------------------+
| year id var random |
|-----------------------------|
1. | 2003 523 6 .0039323 |
2. | 2003 532 3 .0286627 |
|-----------------------------|
3. | 2004 523 3 .0039323 |
4. | 2004 532 6 .0286627 |
+-----------------------------+
这没有得到很好的解释,至少一开始是这样,但我认为你想 select 随机显示面板。 select 下面的方法首先随机观察,然后将任何 select 离子扩展到每个整个面板。它不考虑任何面板中的观察数量。用 -1 标记 selection 只是一个小装置,因此 selected 观察结果可以提前排序。幻数 5——替换为任意幻数的面板——是面板的数量selected(不是百分比),这就是你所要求的。
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 |
+------------+
我有一个很大的不平衡面板数据集,如下所示:
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-column/variable 中的一个随机 ID 号码感兴趣,它以一种我可以随后使用它的方式存储。
因此,我正在寻找像 "pick one random value out of the given set of values from column ID" 这样的命令。我随后想在命令中使用这个随机选择的 id,例如:
xtline income if id==X
应该显示 全年 的随机收入 person/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
编辑:
要在 所有 个面板中随机 select 相同的观察结果:
set seed 12345
generate random = runiform()
bysort id: replace random = random[1]
keep if random < 0.1
sort year (id)
list, sepby(year)
+-----------------------------+
| year id var random |
|-----------------------------|
1. | 2003 523 6 .0039323 |
2. | 2003 532 3 .0286627 |
|-----------------------------|
3. | 2004 523 3 .0039323 |
4. | 2004 532 6 .0286627 |
+-----------------------------+
这没有得到很好的解释,至少一开始是这样,但我认为你想 select 随机显示面板。 select 下面的方法首先随机观察,然后将任何 select 离子扩展到每个整个面板。它不考虑任何面板中的观察数量。用 -1 标记 selection 只是一个小装置,因此 selected 观察结果可以提前排序。幻数 5——替换为任意幻数的面板——是面板的数量selected(不是百分比),这就是你所要求的。
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 |
+------------+