Я использую набор данных примерно из 100 переменных и 1000 строк, аналогичный приведенному ниже:

.      var1  var2  var3  var4
AL      10    11    12     13 
AK      -1    0      0     18
AZ      5     -5    -2     22
VA      15    16     0      0

Как я могу перечислить переменные / наблюдения с отрицательными значениями?

Например, я хотел бы указать, что AK имеет отрицательные значения var1, а AZ имеет отрицательные значения var2 и var3.

1
Krista 23 Окт 2018 в 17:30

2 ответа

Лучший ответ

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

clear

input   str2 state  var1  var2  var3  var4
AL      10    11    12     13 
AK      -1    0      0     18
AZ      5     -5    -2     22
VA      15    16     0      0
end

foreach var in var1 var2  var3  var4 {
    generate tag_`var' = `var' < 0
}

list

     +-------------------------------------------------------------------------------+
     | state   var1   var2   var3   var4   tag_var1   tag_var2   tag_var3   tag_var4 |
     |-------------------------------------------------------------------------------|
  1. |    AL     10     11     12     13          0          0          0          0 |
  2. |    AK     -1      0      0     18          1          0          0          0 |
  3. |    AZ      5     -5     -2     22          0          1          1          0 |
  4. |    VA     15     16      0      0          0          0          0          0 |
     +-------------------------------------------------------------------------------+

Затем вы можете сделать следующее:

list state var1 if tag_var1 == 1

     +--------------+
     | state   var1 |
     |--------------|
  2. |    AK     -1 |
     +--------------+

Или

list state var* if tag_var1 == 1 | tag_var2 == 1 | tag_var3 == 1 | tag_var4 == 1

     +-----------------------------------+
     | state   var1   var2   var3   var4 |
     |-----------------------------------|
  2. |    AK     -1      0      0     18 |
  3. |    AZ      5     -5     -2     22 |
     +-----------------------------------+

Если вам не нужна дополнительная гибкость переменной-маркера, вы можете просто сделать:

list state var1 if var1 < 0

< Сильный > EDIT :

В качестве альтернативы вы можете сделать следующее:

preserve

generate obsno = _n
reshape long var, i(obsno)

rename var value
generate var = "var" + string(_j)

list state var obsno value if value < 0, noobs sepby(state)

  +------------------------------+
  | state    var   obsno   value |
  |------------------------------|
  |    AK   var1       2      -1 |
  |------------------------------|
  |    AZ   var2       3      -5 |
  |    AZ   var3       3      -2 |
  +------------------------------+

restore
2
Pearly Spencer 23 Окт 2018 в 18:03

Можно упомянуть еще два метода. Первый - вычислить минимум в каждом наблюдении (строке), а затем list тогда и только тогда, когда этот минимум отрицателен. Таким образом, вы получите любые нули, положительные и пропущенные значения в одних и тех же наблюдениях.

Другой - просто перебрать переменные и list отдельно.

clear 
input str2 state   var1  var2  var3  var4
AL      10    11    12     13 
AK      -1    0      0     18
AZ      5     -5    -2     22
VA      15    16     0      0
end 

egen min = rowmin(var*) 

list if min < 0 

     +-----------------------------------------+
     | state   var1   var2   var3   var4   min |
     |-----------------------------------------|
  2. |    AK     -1      0      0     18    -1 |
  3. |    AZ      5     -5     -2     22    -5 |
     +-----------------------------------------+


foreach v of var var* { 
    quietly count if `v' < 0 
    if r(N) list `v' if `v' < 0 
} 

     +------+
     | var1 |
     |------|
  2. |   -1 |
     +------+

     +------+
     | var2 |
     |------|
  3. |   -5 |
     +------+

     +------+
     | var3 |
     |------|
  3. |   -2 |
     +------+
1
Nick Cox 23 Окт 2018 в 17:41
52951589