ошибка: chol(): разложение не удалось при вызове gratia::fitted_samples()

Любая помощь в устранении ошибки ниже будет очень признательна.

Я установил GAM в mgcv

# This code runs fine
l9 <- gam(length_t ~ 
             tagged + 
             sex_t0 +
             s(age.x, by = tagged, k = 6) +
             s(age.x, by = sex_t0, k = 6) +
             s(scale_id, bs = "re") + 
             s(age.x, scale_id, bs = "re"), 
           data = long, 
           method = "REML")

Теперь я хотел бы получить апостериорные рисунки из моей подогнанной модели для указанных данных. Я создаю новые данные

# This code runs fine
pred.dat <- data.frame(tagged = c(rep(0, 752), rep(1, 752)), 
                       sex_t0 = c(rep("f", 376), rep("m", 376), rep("f", 376), rep("m", 376)),
                       age.x = c(rep(seq(9, 384, 1), 4)),
                       scale_id = rep(1, 1504))

pred.dat$tagged <- factor(pred.dat$tagged)
pred.dat$sex_t0 <- factor(pred.dat$sex_t0)
pred.dat$scale_id <- factor(pred.dat$scale_id)

а затем попытаться получить апостериорные рисунки из моей подогнанной модели для указанных данных. Обратите внимание, что приведенная ниже функция fitted_samples() взята из замечательного пакета gratia.

# This code get error
pd1 <- fitted_samples(l9, n = 100, newdata = pred.dat, seed = 10)

error: chol(): decomposition failed
Error in rmvn(n = n, mu = coef(model), sigma = V, ncores = ncores) : 
  chol(): decomposition failed

В Интернете сообщается о ряде подобных ошибок (здесь, здесь и здесь, например). Однако я не нашел подобных ошибок в отношении пакета gratia или функции fitted_samples(). Я подозреваю, что fitted_samples() где-то внутренне вызывает функцию chol() и что, возможно, значения в матрице, переданной chol(), не все положительно определенные. Я отмечаю, что на справочной странице для chol() указано, что если x не является положительно определенным, сигнализируется ошибка - что именно все это означает и как решить эту проблему, пока выходит за рамки моего понимания.

В: Будем очень признательны за любую помощь или совет по устранению этой ошибки?

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

# Model
wt9 <- gam(weight_t ~ 
             tagged + 
             sex_t0 +
             s(age.x, by = tagged, k = 5) +
             s(age.x, by = sex_t0, k = 5) + 
             s(scale_id, bs = "re") + 
             s(age.x, scale_id, bs = "re"), 
           data = long, 
           method = "REML")

# Create data
pred.dat <- data.frame(tagged = c(rep(0, 752), rep(1, 752)), 
                       sex_t0 = c(rep("f", 376), rep("m", 376), rep("f", 376), rep("m", 376)),
                       age.x = c(rep(seq(9, 384, 1), 4)),
                       scale_id = rep(1, 1504))

pred.dat$tagged <- factor(pred.dat$tagged)
pred.dat$sex_t0 <- factor(pred.dat$sex_t0)
pred.dat$scale_id <- factor(pred.dat$scale_id)

# Get posterior draws from my fitted model for the specified data
pd1 <- fitted_samples(wt9, n = 100, newdata = pred.dat, seed = 10)

person Pat Taggart    schedule 12.01.2021    source источник
comment
Ковариационная матрица модели, вероятно, не является положительно определенной, что свидетельствует о том, что модель плохо определена или идентифицирована (слишком сложна для данных). Если вы можете отправить мне данные в автономном режиме, я могу посмотреть больше - если вы сделаете traceback() после ошибки, вы должны увидеть, что это на самом деле терпит неудачу в mvnfast::rmvn(), что я использую для многомерной генерации обычных случайных чисел, и на самом деле base::chol() не используется но chol() из библиотеки Armadillo C++. Вам действительно нужен случайный наклон age.x плюс два сглаживания одной и той же переменной?   -  person Gavin Simpson    schedule 12.01.2021