Как я могу выполнить упрощение модели для MCMCglmm?
У меня есть модель со смешанными эффектами, которую я использую в пакете MCMCglmm в R. Есть несколько возможных предикторов, которые я заинтересован в исследовании. Как я могу выполнить упрощение модели, чтобы исключить неинформативные предикторы из модели?
В других контекстах я использовал пошаговую регрессию назад, то есть, начиная с "полной" модели, которая содержит все интересующие меня предикторы, и используя drop1()
найти неинформативные переменные, а затем update()
удалить их из модели.
Ни одна из этих функций не работает с объектами MCMCglmm. Какая моя лучшая альтернатива? Я думаю, что одна из причин drop1()
не работает, так как объект MCMCglmm не имеет значения AIC. Может ли значение DIC использоваться аналогичным образом? Я не знаю много о значениях DIC, но в приведенном ниже примере они, похоже, не ведут себя так, как AIC: после удаления переменной из модели DIC уменьшается более чем на 100.
За update()
Ясно, что можно задать модель заново с нуля, но она включает в себя копирование / вставку довольно длинного вызова функции и становится еще более сложной с более длинными формулами модели, которые включают взаимодействия. Я задавался вопросом, есть ли более простая альтернатива.
Мне также интересно, есть ли причина, по которой не был написан метод для этих функций для работы с объектами MCMCglmm - является ли то, что я пытаюсь сделать, каким-то образом недействительным?
Воспроизводимый пример с использованием частично изобретенных данных:
set.seed(1234)
library(MCMCglmm)
data(bird.families)
n <- Ntip(bird.families)
# Create some dummy variables
d <- data.frame(taxon = bird.families$tip.label,
X1 = rnorm(n),
X2 = rnorm(n),
X3 = sample(c("A", "B", "C"), n, replace = T),
X4 = sample(c("A", "B", "C"), n, replace = T))
# Simulate a phenotype composed of phylogenetic, fixed and residual effects
d$phenotype <- rbv(bird.families, 1, nodes="TIPS") +
d$X1*0.7 +
ifelse(d$X3 == "B", 0.5, 0) +
ifelse(d$X3 == "C", 0.8, 0) +
rnorm(n, 0, 1)
# Inverse matrix of shared phyloegnetic history
Ainv <- inverseA(bird.families)$Ainv
# Set priors
prior <- list(R = list(V = 1, nu = 0.002),
G = list(G1 = list(V = 1, nu = 0.002)))
# Run model
model <- MCMCglmm(phenotype ~ X1 + X2 + X3 + X4,
random = ~taxon,
ginverse = list(taxon=Ainv),
data = d,
prior = prior,
verbose = FALSE)
summary(model)
# drop1(model, test = "Chisq") # doesn't work
# update(model, ~.- X2) # doesn't work
model2 <- MCMCglmm(phenotype ~ X1 + X3 + X4,
random = ~taxon,
ginverse = list(taxon=Ainv),
data = d,
prior = prior,
verbose = FALSE)
summary(model2)
Полный вывод модели:
Iterations = 3001:12991
Thinning interval = 10
Sample size = 1000
DIC: 145.2228
G-structure: ~taxon
post.mean l-95% CI u-95% CI eff.samp
taxon 1.808 0.2167 3.347 17.88
R-structure: ~units
post.mean l-95% CI u-95% CI eff.samp
units 0.6712 0.0003382 1.585 20.98
Location effects: phenotype ~ X1 + X2 + X3 + X4
post.mean l-95% CI u-95% CI eff.samp pMCMC
(Intercept) -0.6005279 -1.5753606 0.2689091 1000.0 0.198
X1 0.7506249 0.5220491 1.0033785 506.8 <0.001 ***
X2 -0.0339347 -0.2452923 0.2085228 900.7 0.712
X3B 0.6276852 0.1238884 1.1727409 1000.0 0.022 *
X3C 1.0533919 0.4244092 1.5095804 1000.0 <0.001 ***
X4B -0.0002833 -0.5099753 0.5103896 478.3 0.978
X4C 0.0723440 -0.4435520 0.6193011 1000.0 0.776
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Уменьшенный выход модели:
Iterations = 3001:12991
Thinning interval = 10
Sample size = 1000
DIC: 296.4755
G-structure: ~taxon
post.mean l-95% CI u-95% CI eff.samp
taxon 1.542 0.07175 3.1 26.33
R-structure: ~units
post.mean l-95% CI u-95% CI eff.samp
units 0.8155 0.0004526 1.661 21.89
Location effects: phenotype ~ X1 + X3 + X4
post.mean l-95% CI u-95% CI eff.samp pMCMC
(Intercept) -0.606920 -1.380267 0.335225 1000.0 0.172
X1 0.750929 0.540667 1.011041 1000.0 <0.001 ***
X3B 0.633123 0.149282 1.243790 1000.0 0.032 *
X3C 1.047085 0.518664 1.570641 1000.0 <0.001 ***
X4B 0.007019 -0.528080 0.512161 509.2 0.998
X4C 0.063093 -0.490103 0.590965 1000.0 0.818
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
0 ответов
Процесс выбора модели достаточно стандартный, независимо от того, какой класс моделей вам подходит или какой пакет вы используете.
Для любой регрессионной модели с участием различных ковариат-кандидатов обратный отбор делает это рекурсивно:
1. fit a model with `p` covariates;
2. drop the least insignificant covariate based on p-value (in your case, the pMCMC value);
3. `p = p - 1` and go back to 1.
The process goes on until there is no insignificant covariates to drop.
Точно так же существует прямой выбор, который начинается с перехвата и непрерывно добавляет ковариаты. Я не буду объяснять это здесь.
Выбор модели также может быть основан на информационных критериях, таких как AIC / BIC. Для вывода MCMC используется DIC. Лучшая модель - та, с наименьшим DIC.
Что я предлагаю, так это то, что вы выполняете обратный выбор. Пока вы устанавливаете различные модели, запишите их значения DIC. В итоге вы получите таблицу, подобную этой:
Model_1 DIC_1
Model_2 DIC_2
. .
. .
В лучшем случае обратный выбор и выбор DIC дают одну и ту же модель. Это означает, что эта модель имеет убедительные доказательства по сравнению с остальными. Ну, ты золотой!
Вы также можете самостоятельно вычислить (откорректировать) R-квадрат, исходя из остатков, исходных данных и предполагаемой стандартной ошибки. Модель с самым большим R-квадратом - лучшая.