如何从变量中对项目进行采样

问题描述 投票:-1回答:2

我有一个大的不平衡面板数据集,如下所示:

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,但有一些面板辍学,即514515516)。

我需要保留数据的面板功能。因此,如果选择随机id,则必须保留任何year-id组合。我不需要随机抽样数据(10%或10次观察)。相反,我感兴趣的是我的id-column / variable中的随机id-number,以我随后可以使用它的方式存储。

因此,我正在寻找一个命令,例如“从列ID中选择一组给定的值中的一个随机值”。我随后想在命令中使用这个随机选择的id,例如:

xtline income if id==X

这应该向我展示随机人/身份证X全年的收入。

select random subset stata sample
2个回答
1
投票

这至少在一开始就没有得到很好的解释,但我认为你想要随机选择面板。下面的方法随机选择第一个观察,然后将任何选择扩展到每个整个面板。它没有考虑任何专家组的观察数量。将选区标记为-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 |
     +------------+

2
投票

获得你想要的东西的一种方法是:

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

编辑:

要在所有面板中随机选择相同的观察结果:

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 |
     +-----------------------------+
© www.soinside.com 2019 - 2024. All rights reserved.