Ошибка «Количество наблюдений <= количество случайных эффектов» - PullRequest
0 голосов
/ 08 апреля 2019

Я использую пакет под названием diagmeta для целей мета-анализа. Я могу использовать этот пакет со встроенным набором данных под названием Schneider2017. Однако, когда я создаю свою собственную базу данных / набор данных, я получаю следующую ошибку:

Ошибка: количество наблюдений (= 300) <= количество случайных эффектов (= 3074) для термина (Группа * Отсечение | Исследование); параметры случайных эффектов и остаточная дисперсия (или параметр масштаба), вероятно, не могут быть идентифицированы </p>

Другой поток здесь на SO предполагает, что ошибка вызвана форматом данных одного или нескольких столбцов. Я удостоверился, что тип данных каждого столбца соответствует этому в наборе данных Schneider2017 - никакого эффекта.

Ссылка на другой поток

Я попытался извлечь все данные из набора данных Schneider2017 в Excel, а затем импортировать набор данных из Excel через R studio. Это опять не имеет значения. Это говорит о том, что что-то в формате данных может быть другим, хотя я не понимаю, как это сделать.

diag2 <- diagmeta(tpos, fpos, tneg, fneg, cutpoint,
                   studlab = paste(author,year,group),
                   data = SRschneider,
                   model = "DIDS", log.cutoff = FALSE,
                   check.nobs.vs.nRE = "ignore")

Набор данных выглядит следующим образом: This is what the dataset looks like

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

Результат от выполнения str (mydataset):

> str(SRschneider)
Classes ‘tbl_df’, ‘tbl’ and 'data.frame':   150 obs. of  10 variables:
 $ ...1    : num  1 2 3 4 5 6 7 8 9 10 ...
 $ study_id: num  1 1 1 1 1 1 1 1 1 1 ...
 $ author  : chr  "Arora" "Arora" "Arora" "Arora" ...
 $ year    : num  2006 2006 2006 2006 2006 ...
 $ group   : chr  NA NA NA NA ...
 $ cutpoint: chr  "6" "7.0" "8.0" "9.0" ...
 $ tpos    : num  133 131 130 127 119 115 113 110 102 98 ...
 $ fneg    : num  5 7 8 11 19 23 25 28 36 40 ...
 $ fpos    : num  34 33 31 30 28 26 25 21 19 19 ...
 $ tneg    : num  0 1 3 4 6 8 9 13 15 15 ...

Ответы [ 2 ]

1 голос
/ 16 апреля 2019

Просто быстрое продолжение подробного ответа Бена.

Статистический метод, реализованный в diagmeta(), предполагает, что аргумент точка отсечения является непрерывной переменной.Мы добавили соответствующую проверку для аргумента среза (а также аргументов TP , FP , TN и FN ) в версии 0.3-1 пакета R diagmeta ;см. commit в GitHub репозитории для технических деталей.

Соответственно, следующие R команды приведут к более информативному сообщению об ошибке:

data(Schneider2017)
diagmeta(tpos, fpos, tneg, fneg, as.character(cutpoint),
         studlab = paste(author, year, group), data = Schneider2017)
0 голосов
/ 08 апреля 2019

Вы сказали, что вы

удостоверился, что тип данных каждого столбца соответствует тому, что в наборе данных Schneider2017

но это не похоже на правду. Помимо различий между типами num (числовой) и int (целочисленный) (которые на самом деле обычно не важны), ваши данные имеют

 $ cutpoint: chr  "6" "7.0" "8.0" "9.0" ...

в то время как str(Schneider2017) имеет

 $ cutpoint: num  6 7 8 9 10 11 12 13 14 15 ...

Если ваша точка отсечения является символом, а не цифрой, это означает, что R будет пытаться рассматривать ее как категориальную переменную (со многими дискретными уровнями). Это очень вероятно источник вашей проблемы.

Переменная cutpoint, вероятно, является символом, поскольку R обнаружил в этом столбце некоторое значение, которое нельзя интерпретировать как числовое (что-то такое же простое, как типографская ошибка). Вы можете использовать SRschneider$cutpoint <- as.numeric(SRschneider$cutpoint) для преобразования переменной в числовое с помощью грубой силы (значения, которые не могут быть интерпретированы, будут установлены на NA), но было бы лучше пойти вверх и посмотреть, в чем проблема.

Если вы используете пакеты tidyverse для загрузки ваших данных, вы должны получить список «проблем с анализом», которые могут быть полезны. Вы также можете попробовать cp <- SRschneider$cutpoint; cp[which(is.na(as.numeric(cp)))] посмотреть на значения, которые не могут быть преобразованы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...