Выполнить точный тест Фишера из агрегированного с использованием Stata - PullRequest
0 голосов
/ 04 августа 2011

У меня есть набор данных, как показано ниже:

A B C D
1 2 3 4
2 3 4 5

Это агрегированные данные, которые ABCD составляют таблицу 2x2, и мне нужно провести точный тест Фишера для каждой строки и добавить новый столбец для p-значения точного теста Фишера для этой строки.

Я могу использовать fisher.exact и цикл, чтобы сделать это в R, но я не могу найти команду в Stata для точного теста Фишера.

Ответы [ 3 ]

3 голосов
/ 04 августа 2011

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

Нет объектов для добавления столбцов. Может быть, вы скажете немного больше о том, что вам в конечном итоге нужно сделать с вашими p-значениями, чтобы найти подходящее решение, которому ваши сотрудники Stata сочувствуют.

Если вы действительно хотите добавить новый столбец (generate новую переменную, говоря Stata), то вы можете посмотреть на tabulate и его возвращаемые значения:

    clear
    input x y f1 f2
    0 0 5 10
    0 1 7 12
    1 0 3 8
    1 1 9 5
    end

Я предполагаю, что ваш A B C D обозначает две двоичные переменные, а числа являются частотами в данных. Вы должны clear памяти, так как Stata думает об одном наборе данных за один раз.

Тогда вы могли бы tabulate результаты и generate новые переменные, содержащие p-значения, хотя это было бы большой тратой памяти на создание переменных, содержащих постоянное значение:

    tabulate x y [fw=f1], exact
    return list
    generate p1 = r(p_exact)
    tabulate x y [fw=f2], exact
    generate p2 = r(p_exact)

Здесь [fw=variable] - это способ задания весов частот; Я набрал return list, чтобы узнать, какую информацию хранит Stata в результате процедуры. ЭТО объектоподобная вещь, с которой работает Стата. R возвращает результаты теста в компоненте fisher.test()$p.value, а Stata создает возвращаемые значения, r(component) для простых команд и e(component) для команд оценки.

Если вы хотите получить циклическое решение (если у вас много наборов), вы можете сделать это:

   forvalues k=1/2 {
    tabulate x y [fw=f`k'], exact
    generate p`k' = r(p_exact)
   }

Это способность к написанию сценариев, в которой Stata, IMHO, намного сильнее, чем R (хотя можно утверждать, что это очень грязная уловка программирования). Локальный макрос k принимает значения от 1 до 2, и этот макрос заменяется на `` k'` повсюду в фигурной скобке.

Кроме того, вы можете хранить результаты в краткосрочной памяти Stata как скаляры:

    tabulate x y [fw=f1], exact
    scalar p1 = r(p_exact)
    tabulate x y [fw=f2], exact
    scalar p2 = r(p_exact)

Однако скаляры не связаны с набором данных, поэтому вы не можете сохранить их с помощью данные.

Непосредственные команды, такие как cci, предлагаемые здесь также вернули бы значения, которые вы можете получить аналогичным образом.

HTH, Стас

2 голосов
/ 04 августа 2011

Посмотрите команду cci с параметром exact:

cci 10 15 30 10, exact

Это часть так называемых «немедленных» команд.Они позволяют выполнять вычисления непосредственно из аргументов, а не из данных, хранящихся в памяти.Посмотрите на help immediate

0 голосов
/ 04 октября 2013

Каждое наблюдение в первоначальном вопросе автора, по-видимому, состояло из четырех отсчетов в одной традиционной таблице 2х2. Код Стаса применяется к данным отдельных наблюдений. Ник отметил, что -cci- может анализировать данные b b d. Вот код, который применяет -cci к каждой таблице и, подобно коду Стаса, добавляет значения p в набор данных. Оператор forvalues i = 1/`=_N' сообщает Stata запустить цикл от первого до последнего наблюдения. a[`i'] относится к значению переменной `a 'в i-м наблюдении.

    clear
    input a b c d
    10 2 8 4
    5 8 2 1
    end

    gen exactp1 = .
    gen exactp2 =.
    label var exactp1 "1-sided exact p"
    label var exactp2 "2-sided exact p"
    forvalues i = 1/`=_N'{
      local a = a[`i']
      local b = b[`i']
      local c = c[`i']
      local d = d[`i']
      qui cci `a' `b' `c' `d', exact
      replace exactp1 = r(p1_exact) in `i'
      replace exactp2 = r(p_exact) in `i'
      }
    list

Обратите внимание, что нет проблем с присвоением локальному макросу того же имени, что и для переменной.

...