Любая помощь в устранении ошибки ниже будет очень признательна.
Я установил 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)
traceback()
после ошибки, вы должны увидеть, что это на самом деле терпит неудачу вmvnfast::rmvn()
, что я использую для многомерной генерации обычных случайных чисел, и на самом делеbase::chol()
не используется ноchol()
из библиотеки Armadillo C++. Вам действительно нужен случайный наклонage.x
плюс два сглаживания одной и той же переменной? - person Gavin Simpson   schedule 12.01.2021