Как выбрать элемент из переменной - PullRequest
0 голосов
/ 13 февраля 2019

У меня большой несбалансированный набор данных панели, который выглядит следующим образом:

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).

Мне нужно сохранить функцию панели данных.Следовательно, если выбран случайный идентификатор, необходимо сохранить любую комбинацию идентификатора года.Мне не нужна случайная выборка данных (ни 10%, ни 10 наблюдений).Скорее меня интересует случайный id-номер из моего id-столбца / переменной, хранящийся таким образом, чтобы я мог впоследствии использовать его.

Таким образом, я ищу команду типа «выбрать одно случайное значение из заданного набора значений из идентификатора столбца».Впоследствии я хочу использовать этот случайно выбранный идентификатор в таких командах, как:

xtline income if id==X

, который должен показывать мне доход за весь год случайного человека / ID X.

Ответы [ 2 ]

0 голосов
/ 13 февраля 2019

Это было не очень хорошо объяснено, по крайней мере, на первый взгляд, но я думаю, что вы хотите выбирать панели случайным образом.Приведенный ниже метод выбирает первые наблюдения случайным образом, а затем расширяет любой выбор на каждую целую панель.Он не учитывает количество наблюдений в любой панели.Пометка выделения с помощью -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 |
     +------------+
0 голосов
/ 13 февраля 2019

Один из способов получить то, что вы хотите, это:

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 |
     +-----------------------------+
...