Создание временных наборов данных в Stata - PullRequest
0 голосов
/ 28 сентября 2018

Я просматриваю много документации по Stata и все еще с трудом нахожу простые примеры некоторых основных задач.

Один пункт, который особенно трудно понять, - это как хранить результаты определенных операций в переменных (в смысле программирования, а не в поле / столбце), чтобы я мог сравнить их друг с другом.И я не говорю о статистических моделях, для которых я мог бы использовать что-то вроде estimates.

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

library(dplyr)

category <- c('a', 'a', 'a', 'b', 'b', 'b', 'c', 'c', 'c')
first <- c(2, 1, 5, 3, 4, 2, 1, 3, 3) 
second <- c(3, 1, 6, 9, 12, 32, 113, 85, 123) 
df <- data.frame(category, first, second)

firstMean <- df %>% group_by(category) %>% summarise(mean = 
mean(first))
secondMean <- df %>% group_by(category) %>% summarise(mean = 
mean(second))

abs(firstMean[,2] - secondMean[,2])

# Results
# a 0.67
# b 14.67
# c 104.67

Вопросы:

  1. Как выполнить ту же задачу в Stata?

Я также читаю о return list, но когда я использую команду сохранения после вычисления моего среднего значения, она перезаписывает ранее выполненную команду.

Есть ли способ, которым я могу назвать это временным образом?

Я не хочу сохранять эти вещи в файле, я только стремлюсь сделать быстрые временные кадры данных.

Ответы [ 3 ]

0 голосов
/ 28 сентября 2018

Вы можете поместить результаты в переменную (в смысле Stata) всего одной строкой.Отображать его без повторов также довольно просто.Ответ @Joe Patten полезен, но он уничтожает текущий набор данных.

clear 
input str1 category first second 
a  2  3
a  1  1
a  5  6
b  3  9 
b  4  12
b  2  32
c  1  113
c  3  85
c  3  123
end 

egen difference = mean(first-second), by(category) 
egen tag = tag(category) 

list category difference if tag , noobs 

tabdisp category, c(difference) format(%4.2f) 

Вот результаты:

. list category difference if tag , noobs 

  +----------------------+
  | category   differe~e |
  |----------------------|
  |        a   -.6666667 |
  |        b   -14.66667 |
  |        c   -104.6667 |
  +----------------------+

. tabdisp category, c(difference) format(%4.2f) 

----------------------
 category | difference
----------+-----------
        a |      -0.67
        b |     -14.67
        c |    -104.67
----------------------

То, к чему вы обращаетесь, может быть совершенно другим, например, с использованием локальных макросов или скаляров или с помощью Mata.Есть несколько способов сделать это в Stata, так же как и в R.

Что касается документации, то нет реальной замены чтению руководств, начиная с [U].Вы можете тратить много времени на поиск в Google, так как в Интернете существует множество очень ограниченных или фрагментарных руководств.В основном они поддерживают то, что авторы намеревались, но более полное понимание возможно только через систематическое чтение.

0 голосов
/ 28 сентября 2018

Ниже приведен дополнительный ответ на решение @ NickCox, которое является наиболее чистым:

clear 
input str1 category first second 
a  2  3
a  1  1
a  5  6
b  3  9 
b  4  12
b  2  32
c  1  113
c  3  85
c  3  123
end 

bysort category: generate difference = round(abs(sum(first / _N) - sum(second / _N)), .01)

Это то, что egen делает со связанной с ним функцией mean() под капотом.Преимущество «ручного» выполнения этого состоит в том, что вы можете объединить функции round() и abs() для округления и получить абсолютное значение разности соответственно за один шаг.

Затем можно представить результаты:

bysort category: list difference if _n == _N

-> category = a

     +------------+
     | difference |
     |------------|
  3. |        .67 |
     +------------+

-> category = b

     +------------+
     | difference |
     |------------|
  3. |      14.67 |
     +------------+

-> category = c

     +------------+
     | difference |
     |------------|
  3. |     104.67 |
     +------------+

Или вы можете сохранить их в переменной:

bysort category: generate results = difference if _n == _N
0 голосов
/ 28 сентября 2018

Я не эксперт в Stata (я в основном работаю на python и балуюсь на R), но этот код должен работать.collapse в stata аналогично group_by в R. После свертывания данных я генерирую переменную разности, а затем сохраняю только эту переменную в моем фрейме данных.Наконец, я сохраняю файл как temp (и заменяю любой другой файл с именем temp.dta на компакт-диске).

use df.dta, clear
collapse (mean) first second, by(category)
gen diff = abs(first-second)
keep diff
save temp, replace
...