mgcv
패키지에서 gam
을 사용하여 모델을 맞추고 결과를 model
에 저장하고 지금까지 plot(model)
을 사용하여 부드러운 구성 요소를 살펴 봤습니다. 나는 최근에 ggplot2를 사용하고 출력을 좋아하기 시작했다. 그래서 궁금, ggplot2 사용하여 이러한 그래프를 그릴 수 있습니까? 여기 ggplot2로 gam fit의 부드러운 구성 요소를 플로팅 할 수 있습니까?
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)
일반적인 경우 나는 매우 감사 할 것입니다.
ggplot이 '= geom_smooth''에 대한'그래서 그냥 할'방법을 predict' 사용은 –
을 gam'' 그것은 적합하지 않고 매끄러운 용어를 표시합니다. 그래서 이것이 해결책이라고 생각하지 않습니다. – unique2
데이터 세트에 링크하십시오. (시작점과 복제하려는 플롯으로'mgcv' 예제를 인용하십시오) 우리는 (아마도) 당신에게 방법을 보여줄 수 있습니다. –