Можно ли изобразить гладкие компоненты подгонки гаммы с помощью ggplot2?

Я подгоняю модель используяgam отmgcv упаковать и сохранить результат вmodel и до сих пор я смотрел на гладкие компоненты, используяplot(model), Я недавно начал использовать ggplot2 и нравится его вывод. Так что мне интересно, можно ли построить эти графики с помощью ggplot2?

Вот пример:

x1 = rnorm(1000)
x2 = rnorm(1000)
n = rpois(1000, exp(x1) + x2^2)

model = gam(n ~ s(x1, k=10) + s(x2, k=20), family="poisson")
plot(model, rug=FALSE, select=1)
plot(model, rug=FALSE, select=2)

И меня интересуетs(x1, k=10) а такжеs(x2, k=20) не в форме.

Частичный ответ:

Я копался глубжеplot.gam а такжеmgcv:::plot.mgcv.smooth и построил мою собственную функцию, которая извлекает предсказанные эффекты и стандартные ошибки из гладких компонентов. Это необрабатывать все варианты и случаиplot.gam поэтому я считаю, что это только частичное решение, но оно хорошо работает для меня.

EvaluateSmooths = function(model, select=NULL, x=NULL, n=100) {
  if (is.null(select)) {
    select = 1:length(model$smooth)
  }
  do.call(rbind, lapply(select, function(i) {
    smooth = model$smooth[[i]]
    data = model$model

    if (is.null(x)) {
      min = min(data[smooth$term])
      max = max(data[smooth$term])
      x = seq(min, max, length=n)
    }
    if (smooth$by == "NA") {
      by.level = "NA"
    } else {
      by.level = smooth$by.level
    }
    range = data.frame(x=x, by=by.level)
    names(range) = c(smooth$term, smooth$by)

    mat = PredictMat(smooth, range)
    par = smooth$first.para:smooth$last.para

    y = mat %*% model$coefficients[par]

    se = sqrt(rowSums(
      (mat %*% model$Vp[par, par, drop = FALSE]) * mat
    ))

    return(data.frame(
      label=smooth$label
      , x.var=smooth$term
      , x.val=x
      , by.var=smooth$by
      , by.val=by.level
      , value = y
      , se = se
    ))
  }))
}

Это возвращает "расплавленный» фрейм данных с гладкими компонентами, так что теперь можно использоватьggplot с примером выше:

smooths = EvaluateSmooths(model)

ggplot(smooths, aes(x.val, value)) + 
  geom_line() + 
  geom_line(aes(y=value + 2*se), linetype="dashed") + 
  geom_line(aes(y=value - 2*se), linetype="dashed") + 
  facet_grid(. ~ x.var)

Если кто-нибудь знает пакет, который позволяет это в общем случае, я был бы очень благодарен.

Ответы на вопрос(2)

Ваш ответ на вопрос