Ошибка при сериализации модели gamcv с jsonlite - PullRequest
0 голосов
/ 14 апреля 2020

Я хочу «сериализовать» надежным способом модель ggcv gam с jsonlite, чтобы позже использовать ее с rpy2.

(Что я имею в виду под надежным: при использовании python я считаю, что Pickle не является надежным, потому что после каждого обновления Python конвейер сериализации разрывается, поэтому я предпочитаю использовать формат json с jsonlite, который мне кажется более устойчивым (но я могу ошибаться).)

jsonlite выполняет довольно хорошую работу по сравнению с RJSONIO: каждая деталь модели mgcv корректно сериализуется, за исключением дополнительной переменной Environnement:

проверка исходной модели b

проверка десериализованной модели new_b

На предыдущих двух изображениях вы видите, что: Environnement: пространство имен: статистика становится Environnement : R_GlobalEnv

Я не уверен, как с этим справиться. Любой совет приветствуется.

Вот минимальный воспроизводимый пример:


> library(mgcv)
> n = 40
> x <- 1:n/n  # data between [0, 1]
> x2 <- 1:n/n  # data between [0, 1]
> x3 <- 1:n/n  # data between [0, 1]
> mu <- exp(-400*(x-.6)^2)+5*exp(-500*(x-.75)^2)/3+2*exp(-500*(x-.9)^2)
> y <- mu+0.5*rnorm(n)
> b <- gam(y~s(x)+te(x2, x3))
> 
> library(jsonlite)
> json_str = serializeJSON(b)
> new_b = unserializeJSON(json_str)
> mat     <- predict.gam(b    , type = "terms")
> new_mat <- predict.gam(new_b, type = "terms")
Error in if (object$by != "NA") { : 
  valeur manquante là où TRUE / FALSE est requis
> 

1 Ответ

0 голосов
/ 14 апреля 2020

В jsonlite есть проблема: «NA» был сериализован в NA. (проблема не была вызвана изменением переменной среды)

Быстрое исправление:

new_b$smooth[[2]]$by = "NA"
new_b$smooth[[1]]$by = "NA"
new_mat <- predict.gam(new_b, type = "terms")


...