Ich bin ein Modell mit gam
aus dem mgcv
Paket und speichern Sie das Ergebnis in model
und bis jetzt habe ich auf die glatten Komponenten mit plot(model)
. Ich habe kürzlich begonnen, ggplot2 zu verwenden und mag seine Ausgabe. Ich frage mich, ob es möglich ist, diese Graphen mit ggplot2 zu plotten? HierIst es möglich, die glatten Komponenten eines Gam Fit mit ggplot2 zu plotten?
ein Beispiel:
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)
Und ich bin Interesse an s(x1, k=10)
und s(x2, k=20)
nicht in der Passform.
Teil Antwort:
Ich grub tiefer in plot.gam
und mgcv:::plot.mgcv.smooth
und baute meine eigene Funktion, die die vorhergesagten Effekte und Standardfehler von den glatten Komponenten extrahiert. Es behandelt nicht alle Optionen und Fälle von plot.gam
, also halte ich es nur für eine Teillösung, aber es funktioniert gut für mich.
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
))
}))
}
Dies liefert einen „geschmolzenen“ Datenrahmen mit den glatten Komponenten, so ist es nun möglich, ggplot
mit dem Beispiel zu verwenden, oben:
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)
Wenn jemand ein Paket kennt, welche diese in die ermöglicht Allgemeiner Fall wäre ich sehr dankbar.
ggplot verwendet 'predict' für' geom_smooth', so dass nur tun 'method = 'gam'' –
Wie ich geom_smooth verstehen es zeigt die Passform und nicht die glatten Begriffe an. Also ich denke nicht, dass dies die Lösung ist. – unique2
Link zu einem Dataset (zitieren Sie einfach ein Beispiel von 'mgcv' als Ausgangspunkt und das Diagramm, das Sie versuchen zu duplizieren) und wir können (wahrscheinlich) Ihnen zeigen, wie. –