裏 RjpWiki

Julia ときどき R, Python によるコンピュータプログラム,コンピュータ・サイエンス,統計学

少し手を加えておかないとね

2011年06月03日 | ブログラミング

裏で何がどのようにやられていようと,一つの関数を呼ぶだけで描画したいとでも?以下のような関数を定義しておいて,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)

コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

PVアクセスランキング にほんブログ村

PVアクセスランキング にほんブログ村