裏で何がどのようにやられていようと,一つの関数を呼ぶだけで描画したいとでも?以下のような関数を定義しておいて,plot(glmオブジェクト) とやれば,グラフは描かれます。 -- 河童の屁は,河童にあらず,屁である。? 2011-06-03 (金) 14:18:45
plot.glm <- function(a)
{
x <- a$data$x
y <- a$data$y
plot(x, y)
points(x, a$fitted.values, col="red")
d <- data.frame(x=seq(x[1], x[length(x)], length=500))
lines(d$x, predict(a, d, type="response"), col="red")
}
# 使用例
d <- data.frame(x=1:10, y=c(0,0,0,1,0,1,1,1,1,1))
a <- glm(y~x, data=d, family=binomial)
plot(a)
# 当然ながら,logit 以外にも対応
plot(glm(y~x, data=d, family=binomial(link="probit")))
plot(glm(y~x, data=d, family=gaussian))
は,関数外部で定義されるデータフレームの変数名が x, y でないときには正しく動かないっぽいので,取りあえず以下のように変更しておかないと行けないのではないかなあ。
でも,eval(parse(text="...")) を使うのはちょっと(かなり)ださいなあ。
plot.glm <- function(a)
{
c.x <- as.character(a$term[[3]])
c.y <- as.character(a$term[[2]])
x <- eval(parse(text=sprintf("a$data$%s", c.x)))
y <- eval(parse(text=sprintf("a$data$%s", c.y)))
eval(parse(text=sprintf("plot(x, y, xlab='%s', ylab='%s')", c.x, c.y)))
points(x, a$fitted.values, col="red")
d <- data.frame(x=seq(x[1], x[length(x)], length=500))
eval(parse(text=sprintf("colnames(d) <- '%s'", c.x)))
lines(d[,1], predict(a, d, type="response"), col="red")
}
d <- data.frame(a1=1:10, a2=c(0,0,0,1,0,1,1,1,1,1))
a <- glm(a2~a1, data=d, family=binomial)
plot(a)