私は、mgcv
パッケージからgam
を使用してモデルをフィッティングし、その結果をmodel
に保存しています。これまではplot(model)
を使用して滑らかなコンポーネントを見てきました。私は最近ggplot2を使い始め、その出力を好きになっています。ですから、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)
一般的なケース私は非常に感謝します。
ggplotはこれだけやる 'メソッド= 'gam'' –
、' 'geom_smooth'ためpredict'を使用していますそれはフィットを表示し、滑らかな用語を表示しません。だから私はこれが解決策だとは思わない。 – unique2
データセットにリンクします(開始点と複製しようとしているプロットとして 'mgcv'の例を挙げてください)。 –