Коэффициенты gl mnet отличаются в разных версиях (2.0.16 и 3.0.2) - PullRequest
1 голос
/ 18 февраля 2020

Я управляю внутренней кодовой базой, которая сильно зависит от пакета glmnet. После обновления до новейшей версии (v3.0.2) мои модульные тесты начали давать сбои для коэффициентов модели Кокса. Предыдущая версия glmnet была v2.0.16 (R 3.5.2). Я сейчас использую R v3.6.2.

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

Ниже приведен reprex на основе набора данных mtcars, в котором установлены 2 случайно выбранных объекта и переименование двух переменных в time и status, чтобы обеспечить возможность подгонки модели Кокса. Правильное сравнение по представлению сложно, так как для этого потребуются другие установки R, но это должно позволить любому воспроизвести проблему.

library(magrittr)
library(dplyr)
library(glmnet)
dat <- mtcars %>%
    select(mpg, disp, status = vs, time = hp) %>%   # select 2 features; assign time & status
    mutate_at(1:2, ~ {
      log10(.x) %>% subtract(mean(.)) %>% divide_by(sd(.))   # center & scale
    }) %>% as.matrix()
glmnet(dat[, 1:2], dat[, 3:4], family = "cox", lambda = 0)$beta   # fit model

Результат для v3.0.2:

#> 2 x 1 sparse Matrix of class "dgCMatrix"
#>              s0
#> mpg   0.2293535
#> disp -1.8160387

Результат для v2.0.16:

#> 2 x 1 sparse Matrix of class "dgCMatrix"
#>              s0
#> mpg   0.2154324
#> disp -1.8172714

Заметили ли другие аналогичные расхождения? Я несколько удивлен, что не нашел кого-то еще, сталкивающегося с той же самой проблемой. Должен ли я обновить все мои юнит-тесты: (

Советы и / или объяснения очень важны. Заранее спасибо.

1 Ответ

2 голосов
/ 19 февраля 2020

Немного слишком длинно для комментария:

  • Я воспроизвел ваши результаты на Ubuntu 16.04 (используя devtools::install_version(), см. Ниже).
  • 2.0-16 до 3.0 -2 охватывает несколько выпусков (и еще несколько выпусков с внутренним обозначением): файл NEWS содержит несколько ссылок на coxnet (предположительно внутренняя функция, вызываемая для family="cox":

    • 2.0-20:
      • Исправлена ​​ошибка во внутренней функции co xnet .deviance, связанной с входным предком, а также с насыщенным логоподобным (отсутствует) и весами
      • добавлена ​​функция Кокграда для вычисления градиента
    • 2.0-19: исправлена ​​ошибка в co xnet, связанная со связями между набором смерти и риск установлен
Я бы предложил использовать
devtools::install_version("glmnet",version=...,lib=<version-specific>)

для установки каждой версии с 2.0-16 до 3.0-2 включительно, каждая в отдельная библиотека, чтобы упростить (через library("glmnet", lib.loc=...) загрузку разных версий пакета и разделить пополам, чтобы найти спецификацию c. (Промежуточные версии были не выпущены, поэтому вы будете переходить с 2.0-18 на 3.0.)

Я предполагаю, что одно из этих coxnet исправлений ошибок (намеренно или как побочный эффект) ответственно для изменений.

Если бы он был в доступном репозитории git, вы могли бы использовать git bisect с локальной копией для автоматизации процесса (возможно, не стоит этого для такого небольшого количества точек изменения, но это не Не похоже, что дерево разработки доступно: есть хороший pkgdown сайт , но я не вижу ссылок на систему контроля версий.

Если у вас много времени на вашем руками вы можете скачать все архивные архивы и искать их на предмет изменений ...

...