Я использую игровую модель, используя пакет mgcv
с одним сглаживающим сплайном и двумя факторными переменными в качестве дополнительных элементов управления. Я хочу показать график предсказаний по всему диапазону независимой сглаженной переменной (с одновременными интервалами):
library(mgcv)
mod <- gam(dv_value ~ age_grps + period.f + s(born_adult), data = dat, contrasts = list(age_grps = contr.sum, period.f = contr.sum))
Сначала я вычисляю предсказанные значения по всему диапазону переменной born_adult
с одновременныминтервал, который, кажется, работает довольно хорошо:
rmvn <- function(n, mu, sig) {
L <- mroot(sig)
m <- ncol(L)
t(mu + L %*% matrix(rnorm(m*n), m, n))
}
Vb <- vcov(mod)
pred <- predict(mod, se.fit = TRUE)
se.fit <- pred$se.fit
N <- 10000
BUdiff <- rmvn(N, mu = rep(0, nrow(Vb)), sig = Vb)
Cg <- predict(mod, type = "lpmatrix")
simDev <- Cg %*% t(BUdiff)
absDev <- abs(sweep(simDev, 1, se.fit, FUN = "/"))
masd <- apply(absDev, 2L, max)
crit <- quantile(masd, prob = 0.95, type = 8)
predData <- transform(cbind(data.frame(pred), dat),
uprP = fit + (crit * se.fit),
lwrP = fit - (crit * se.fit))
Однако, пытаясь построить результаты, я получаю действительно странный график:
ggplot() +
geom_ribbon(aes(x = born_adult, ymin = lwrP, ymax = uprP), data = predData, alpha = 0.2, fill = "red")
https://www.dropbox.com/s/uskj9oyq8ud3zx2/plot1.png?dl=0
Но, при обработке моих управляющих переменных, я получаю правильные прогнозы для отдельных «срезов» моих данных:
ggplot() +
geom_ribbon(aes(x = born_adult, ymin = lwrP, ymax = uprP), data = predData, alpha = 0.2, fill = "red") +
facet_wrap(vars(period.f, age_grps))
https://www.dropbox.com/s/yju68yl8kes8mp1/plot2.png?dl=0
Я также попытался предсказатьНовый смоделированный набор данных использует ту же структуру, что и мои данные, однако проблема осталась прежней. Есть ли возможность показать «средние» прогнозы по всему диапазону моей независимой сглаженной переменной, не обращая внимания на контрольные переменные? Я полагаю, что это может сработать, взяв средние прогнозы, сгруппированные по значениям переменной born_adult
: predData <- group_by(born_adult) %>% summarize(fit = mean(fit))
Однако я не знаю, как взять среднее значение одновременных интервалов для единичных прогнозов.
И последнее, но не менее важное: вот небольшое подмножество данных, которые я использую:
dat <- structure(list(dv_value = c(0.8, 0.8, 0.4, 0.8, 1, 0.6, 0.6,
1, 0.8, 1, 1, 1, 1, 0.4, 0.8, 0.8, 1, 0.4, 1, 0.6, 1, 0.8, 0.6,
0, 0.6, 0.8, 0.8, 1, 0.8, 0.8, 0.8, 1, 1, 1, 0.8, 1, 0.6, 1,
0.6, 0.8, 0.8, 0.8, 0.6, 1, 1, 1, 0.6, 1, 1, 1, 0.8, 1, 0.6,
0.6, 1, 1, 0.8, 0.6, 0.8, 0.6, 1, 0.8, 0.8, 0.6, 0.8, 0.8, 1,
1, 0.8, 0.8, 0.8, 1, 1, 0.6, 1, 1, 1, 1, 1, 1, 0.6, 0.8, 1, 1,
1, 1, 1, 1, 1, 1, 1, 0.6, 1, 0.6, 0.6, 0.6, 0.8, 0.8, 0.8, 0.8,
1, 0.4, 0.8, 1, 1, 1, 1, 0.4, 1, 1, 0.6, 1, 1, 0.4, 0.6, 0.8,
1, 1, 0.6, 1, 1, 0.6, 1, 0.8, 0.8, 1, 0.8, 1, 0.8, 1, 0.6, 0.8,
1, 0.8, 0.6, 0.6, 1, 0.8, 0.6, 1, 0.6, 1, 0.6, 0.8, 1, 0.6, 1,
0.8, 0.8, 0.8, 1, 1, 1, 1, 0.2, 1, 0.6, 1, 0.8, 0.8, 1, 0.6,
1, 0.4, 1, 0.8, 0.8, 0.4, 1, 1, 0.8, 0.8, 0.8, 1, 0.8, 0.6, 0.6,
0.4, 0.2, 1, 0.8, 0.4, 1, 1, 0.8, 1, 0.8, 0.6, 1, 1, 1, 0.8,
1, 0.6, 0.8, 0.8, 1, 1, 0.8, 1), age_grps = structure(c(1L, 3L,
3L, 3L, 1L, 2L, 3L, 3L, 2L, 2L, 2L, 3L, 2L, 2L, 3L, 3L, 3L, 2L,
3L, 3L, 3L, 2L, 3L, 2L, 2L, 2L, 3L, 3L, 3L, 1L, 3L, 2L, 3L, 3L,
2L, 1L, 2L, 2L, 2L, 3L, 3L, 2L, 1L, 2L, 3L, 1L, 2L, 3L, 2L, 3L,
2L, 2L, 3L, 3L, 2L, 3L, 3L, 2L, 3L, 1L, 3L, 1L, 2L, 3L, 2L, 3L,
2L, 3L, 2L, 3L, 3L, 2L, 2L, 1L, 2L, 2L, 2L, 2L, 3L, 2L, 2L, 1L,
2L, 3L, 2L, 3L, 3L, 2L, 3L, 1L, 3L, 2L, 2L, 2L, 1L, 2L, 2L, 1L,
3L, 3L, 3L, 3L, 2L, 2L, 2L, 2L, 2L, 3L, 2L, 2L, 3L, 3L, 2L, 2L,
3L, 3L, 1L, 2L, 1L, 3L, 2L, 2L, 3L, 2L, 2L, 2L, 2L, 2L, 3L, 3L,
3L, 3L, 3L, 2L, 3L, 2L, 3L, 3L, 2L, 1L, 2L, 1L, 2L, 2L, 1L, 2L,
2L, 2L, 3L, 2L, 1L, 2L, 2L, 2L, 1L, 1L, 2L, 2L, 2L, 3L, 1L, 1L,
2L, 3L, 2L, 3L, 3L, 3L, 2L, 1L, 2L, 2L, 2L, 2L, 2L, 2L, 1L, 2L,
2L, 1L, 3L, 3L, 3L, 3L, 2L, 1L, 2L, 3L, 3L, 3L, 3L, 2L, 2L, 2L,
2L, 3L, 2L, 3L, 3L, 2L), .Label = c("1", "2", "3"), class = "factor"),
period.f = structure(c(9L, 9L, 6L, 5L, 10L, 2L, 3L, 6L, 13L,
5L, 2L, 2L, 13L, 6L, 7L, 13L, 3L, 7L, 5L, 9L, 5L, 7L, 9L,
10L, 7L, 13L, 3L, 13L, 6L, 2L, 10L, 6L, 9L, 9L, 9L, 13L,
6L, 7L, 5L, 13L, 3L, 13L, 6L, 10L, 13L, 3L, 7L, 2L, 3L, 9L,
10L, 2L, 6L, 6L, 2L, 7L, 6L, 5L, 13L, 2L, 13L, 2L, 3L, 9L,
13L, 9L, 7L, 10L, 2L, 13L, 2L, 13L, 10L, 7L, 7L, 9L, 3L,
6L, 5L, 5L, 9L, 7L, 13L, 2L, 3L, 6L, 6L, 2L, 13L, 10L, 13L,
13L, 10L, 13L, 6L, 5L, 2L, 5L, 6L, 6L, 13L, 7L, 13L, 7L,
13L, 13L, 13L, 9L, 13L, 3L, 13L, 13L, 10L, 3L, 10L, 7L, 13L,
7L, 5L, 3L, 13L, 9L, 5L, 10L, 2L, 6L, 6L, 2L, 13L, 13L, 13L,
9L, 6L, 10L, 5L, 13L, 13L, 7L, 6L, 6L, 7L, 7L, 6L, 3L, 2L,
9L, 2L, 5L, 9L, 9L, 2L, 13L, 10L, 13L, 9L, 10L, 2L, 6L, 7L,
6L, 2L, 5L, 13L, 5L, 3L, 9L, 7L, 13L, 7L, 3L, 9L, 7L, 9L,
3L, 2L, 7L, 2L, 3L, 7L, 7L, 6L, 3L, 5L, 9L, 9L, 10L, 6L,
6L, 10L, 2L, 10L, 6L, 6L, 5L, 13L, 3L, 13L, 3L, 3L, 2L), .Label = c("1991",
"1992", "1993", "1994", "1995", "1996", "1998", "2000", "2002",
"2005", "2008", "2014", "2018"), class = "factor"), born_adult = c(1994,
1953, 1937, 1944, 1996, 1977, 1944, 1953, 2001, 1976, 1963,
1950, 1978, 1984, 1938, 1969, 1928, 1977, 1943, 1945, 1951,
1968, 1959, 1971, 1978, 1998, 1951, 1976, 1951, 1987, 1950,
1969, 1955, 1946, 1981, 2008, 1968, 1975, 1957, 1942, 1950,
1978, 1993, 1986, 1974, 1982, 1960, 1948, 1953, 1943, 1980,
1963, 1943, 1944, 1958, 1953, 1937, 1971, 1971, 1983, 1954,
1984, 1979, 1952, 1984, 1946, 1959, 1949, 1979, 1953, 1947,
1980, 1979, 1996, 1973, 1964, 1952, 1955, 1948, 1980, 1961,
1994, 1991, 1949, 1979, 1947, 1941, 1955, 1962, 2004, 1974,
1993, 1976, 1994, 1994, 1974, 1976, 1990, 1946, 1947, 1961,
1941, 1991, 1986, 1983, 1983, 1988, 1953, 1990, 1965, 1961,
1971, 1979, 1977, 1956, 1948, 2015, 1973, 1988, 1935, 2004,
1983, 1948, 1993, 1976, 1960, 1959, 1980, 1968, 1968, 1970,
1940, 1949, 1964, 1941, 2005, 1959, 1954, 1969, 1988, 1959,
1989, 1971, 1975, 1989, 1980, 1953, 1955, 1959, 1972, 1986,
1988, 1974, 1981, 1998, 2001, 1959, 1970, 1960, 1944, 1986,
1984, 2000, 1946, 1978, 1930, 1952, 1956, 1979, 1982, 1969,
1980, 1961, 1973, 1951, 1979, 1982, 1970, 1974, 1998, 1944,
1941, 1950, 1948, 1978, 1999, 1955, 1930, 1961, 1942, 1962,
1980, 1983, 1974, 1992, 1949, 2003, 1949, 1949, 1976)), row.names = c(NA,
-200L), class = c("tbl_df", "tbl", "data.frame"))
Любая помощь очень ценится!