2008-12-14

ロジスティック回帰2

前回は、ロジスティック回帰モデルの概念を説明した上で、カブトガニの甲羅の幅を説明変数とする、単項ロジスティック回帰モデルを当てはめました。で、当てはめた上で、予測値を計算して、グラフにプロットしました。

とりあえず、前回で、データにモデルを当てはめることは出来ました。
でも、データを使って計算できる事と、計算に用いたモデルが、データに当てはまってる事とは、全く別問題です。
言い換えれば、数字とデータ形式さえ合えば、計算することなんて簡単です。なんせ、計算するのは、人でなくてコンピューターですもん。
と言うわけで、当てはめた統計モデルが、データと整合性があるかを、今回はチェックしてみます

長々と書きましたが、簡単に言えば、回帰分析でいう回帰診断とか、残差分析と同じことです。

まず、前回の計算結果は、こんな感じでした
ただし、今回は、corパラメータを指定して、coefficient内の相関係数も出力しています

===============================================================
>summary(crab.result, cor=T)


Call:
glm(formula = crab.data$satell.flag ~ crab.data$width, family = binomial)

Deviance Residuals:
Min 1Q Median 3Q Max
-2.0281 -1.0458 0.5480 0.9066 1.6941

Coefficients:
Estimate Std. Error z value Pr(>|z|)
(Intercept) -12.3508 2.6287 -4.698 2.62e-06 ***
crab.data$width 0.4972 0.1017 4.887 1.02e-06 ***
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

(Dispersion parameter for binomial family taken to be 1)

Null deviance: 225.76 on 172 degrees of freedom
Residual deviance: 194.45 on 171 degrees of freedom
AIC: 198.45

Number of Fisher Scoring iterations: 4

Correlation of Coefficients:
(Intercept)
crab.data$width -1.00

===============================================================

Deviance Residuals:
Null deviance

が逸脱度を表します
また、

crab.result%reiduals

ここで、crab.resultは、関数glm()の結果が入っているオブジェクト(変数です)
コマンドを入力すれば、個別データの残差についてデータを得ることが出来ます。が、今回は、まだ不勉強のため、パスです

と言うわけで、今回計算するのは、予測値の95%信頼区間です
つまり、前回計算した予測値が、95%の確率で、どの範囲でばらつくかを、グラフ化しようと言うわけです。予測値の区間推定を考えるのは、Coefficientsたちが、推計値だったことを考えれば、当然ですよね。

まず、大標本下での線型予測子の標準誤差(ASE)は、下式になります

Var(hat(α)+hat(β))=Var(hat(α)+x^2Var(β)+2x*Cov(hat(α),hat(β))

*1 hat()は推計値 
*2 x 独立変数 を表します
*3 Cov(α,β)= r * sqrt(Var(α))*sqrt(Var(β))
ただし、rは相関係数

早速、線型予測子、つまり、オッズの95%信頼区間を計算しましょう。
まず、coefficientの分散を変数に叩き込んでおきます

> var.a <- 2.6287*2.6287
> var.b <- 0.1017*0.1017

続いて、Coefficient間の相関係数も変数に入れておきます

> r.coef <- -1

準備が整いましたので、先ほど示した線型予測子の標準誤差(ASE)を計算しましょう

> ASE.linear.predictor <- var.a+(crab.data$width^2)*var.b+(c*crab.data$width*sqrt(var.a*var.b))

ごちゃごちゃしてますが、掛け算と足し算しかありません
小学生でも、計算できます
さて、つづきまして、線型予測子の標準誤差を用いて、線型予測子の95%信頼区間を計算しましょう

ASE(Asymptotic Standard Error)は、大標本下で正規分布に従うので、95%信頼区間の信頼係数は、1.96です。そんなわけで、上限と下限の信頼区間は

> upper95.logit.ci <- crab.result$linear.predictor+(1.96*sqrt(ASE.linear.predictor))

> lower95.logit.ci <- crab.result$linear.predictor-(1.96*sqrt(ASE.linear.predictor))

で計算できます
ちなみに、crab.result$linear.predictorと指定するれば、ワザワザ計算せずとも、Rが、独立変数に対する線型予測子を返してくれます。

さて、線型予測子の信頼区間が求まりました
でも、線型予測子は、オッズの信頼区間です
オッズに対して、線型モデルを当てはめたのが、ロジスティック回帰でしたから。
でも、オッズのままでは、モデルの解釈が難しいですよね
だから、ここから、前使った式で、オッズから、確率に計算しなおします。計算式は、確率を独立変数の関数として考えた、こんな感じの式でしたね

π(x)=exp(α+βx)/(1+exp(α+βx))

さて、α+βxは、いままでに計算済みです
そこで、上の式に、さっき計算した2つの変数

upper95.logit.ci
lower95.logit.ci

を叩き込んで、確率の信頼区間を計算しましょう
それが、こんな感じです

> upper95.ci <- exp(upper95.logit.ci)/(1+exp(upper95.logit.ci))
> lower95.ci <- exp(lower95.logit.ci)/(1+exp(lower95.logit.ci))

言うまでもなく、この二つが、上限と下限の信頼区間のベクトルです


さて、つまんねえ計算が終わったので、上の結果を、予測確率と共に、グラフにしてみましょう。もちろん、x軸は、カブトガニの甲羅の幅ですよ

最初に、下限の信頼区間

> plot(crab.data$width[width.order],lower95.ci[width.order],xlim=c(21,34),ylim=c(0,1),xlab="",ylab="",col="blue",type="l")

上書きを許可
> par(new =T)

次に、上限の信頼区間

> plot(crab.data$width[width.order],upper95.ci[width.order],xlim=c(21,34),ylim=c(0,1),xlab="",ylab="",col="red",type="l")

上書きを許可

> par(new =T)

つづいて、予測確率をプロット

> plot(crab.data$width[width.order],crab.result$fitted.values
[width.order],xlim=c(21,34),ylim=c(0,1),xlab="Crab.Width",ylab="Probability",type="l",
+ main ="Ex. of Logistic Regression/ 95% of C.I.")

上書きを許可しておいて
> par(new =T)

最後に、カテゴリー化したデータから計算したサンプル確率をプロット
>plot(crab.category$width.cate,crab.category$SampleRatio,xlim=c(21,34),ylim=c(0,1),xlab="",ylab="",col="red")

で、出てきたのが、上のグラフです

赤:上限の95%信頼区間
青:下限の95%信頼区間
黒:予測確率
赤の点:カテゴリー化したデータから計算したサンプル確率

なんだか、えらい手間をかけたワリには、簡単なグラフですね
すでに、計算してあればいいのに、なんて思ってしまいますね

次回は、Devianceとかresidualsあたりを説明する予定です


=======================================================
なんだか、えらく長くなった

(参考文献)
カテゴリカルデータ解析入門
Alan Agresti
サイエンティスト社

のp.151あたりを計算

(感想)
データハンドリングが大変
アクセスとかエクセルなら、簡単なのになんて思ったりします
あと、Coefficient間の相関係数が、どうすれば出せるのかが
中々分からなかった。
やったことは大したことないのに、コマンドを調べたりするのは
みょーーーーに、大変だったのでした

なんか、先に、重回帰分析とかを、試してみればよかったかも
そんな気がしている

いずれにしても、まだまだ勉強中の身ですね
=======================================================
前回は、ロジスティック回帰モデルの概念を説明した上で、カブトガニの甲羅の幅を説明変数とする、単項ロジスティック回帰モデルを当てはめました。で、当てはめた上で、予測値を計算して、グラフにプロットしました。

とりあえず、前回で、データにモデルを当てはめることは出来ました。
でも、データを使って計算できる事と、計算に用いたモデルが、データに当てはまってる事とは、全く別問題です。
言い換えれば、数字とデータ形式さえ合えば、計算することなんて簡単です。なんせ、計算するのは、人でなくてコンピューターですもん。
と言うわけで、当てはめた統計モデルが、データと整合性があるかを、今回はチェックしてみます

長々と書きましたが、簡単に言えば、回帰分析でいう回帰診断とか、残差分析と同じことです。

まず、前回の計算結果は、こんな感じでした
ただし、今回は、corパラメータを指定して、coefficient内の相関係数も出力しています

===============================================================
>summary(crab.result, cor=T)


Call:
glm(formula = crab.data$satell.flag ~ crab.data$width, family = binomial)

Deviance Residuals:
Min 1Q Median 3Q Max
-2.0281 -1.0458 0.5480 0.9066 1.6941

Coefficients:
Estimate Std. Error z value Pr(>|z|)
(Intercept) -12.3508 2.6287 -4.698 2.62e-06 ***
crab.data$width 0.4972 0.1017 4.887 1.02e-06 ***
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

(Dispersion parameter for binomial family taken to be 1)

Null deviance: 225.76 on 172 degrees of freedom
Residual deviance: 194.45 on 171 degrees of freedom
AIC: 198.45

Number of Fisher Scoring iterations: 4

Correlation of Coefficients:
(Intercept)
crab.data$width -1.00

===============================================================

Deviance Residuals:
Null deviance

が逸脱度を表します
また、

crab.result%reiduals

ここで、crab.resultは、関数glm()の結果が入っているオブジェクト(変数です)
コマンドを入力すれば、個別データの残差についてデータを得ることが出来ます。が、今回は、まだ不勉強のため、パスです

と言うわけで、今回計算するのは、予測値の95%信頼区間です
つまり、前回計算した予測値が、95%の確率で、どの範囲でばらつくかを、グラフ化しようと言うわけです。予測値の区間推定を考えるのは、Coefficientsたちが、推計値だったことを考えれば、当然ですよね。

まず、大標本下での線型予測子の標準誤差(ASE)は、下式になります

Var(hat(α)+hat(β))=Var(hat(α)+x^2Var(β)+2x*Cov(hat(α),hat(β))

*1 hat()は推計値 
*2 x 独立変数 を表します
*3 Cov(α,β)= r * sqrt(Var(α))*sqrt(Var(β))
ただし、rは相関係数

早速、線型予測子、つまり、オッズの95%信頼区間を計算しましょう。
まず、coefficientの分散を変数に叩き込んでおきます

> var.a <- 2.6287*2.6287
> var.b <- 0.1017*0.1017

続いて、Coefficient間の相関係数も変数に入れておきます

> r.coef <- -1

準備が整いましたので、先ほど示した線型予測子の標準誤差(ASE)を計算しましょう

> ASE.linear.predictor <- var.a+(crab.data$width^2)*var.b+(c*crab.data$width*sqrt(var.a*var.b))

ごちゃごちゃしてますが、掛け算と足し算しかありません
小学生でも、計算できます
さて、つづきまして、線型予測子の標準誤差を用いて、線型予測子の95%信頼区間を計算しましょう

ASE(Asymptotic Standard Error)は、大標本下で正規分布に従うので、95%信頼区間の信頼係数は、1.96です。そんなわけで、上限と下限の信頼区間は

> upper95.logit.ci <- crab.result$linear.predictor+(1.96*sqrt(ASE.linear.predictor))

> lower95.logit.ci <- crab.result$linear.predictor-(1.96*sqrt(ASE.linear.predictor))

で計算できます
ちなみに、crab.result$linear.predictorと指定するれば、ワザワザ計算せずとも、Rが、独立変数に対する線型予測子を返してくれます。

さて、線型予測子の信頼区間が求まりました
でも、線型予測子は、オッズの信頼区間です
オッズに対して、線型モデルを当てはめたのが、ロジスティック回帰でしたから。
でも、オッズのままでは、モデルの解釈が難しいですよね
だから、ここから、前使った式で、オッズから、確率に計算しなおします。計算式は、確率を独立変数の関数として考えた、こんな感じの式でしたね

π(x)=exp(α+βx)/(1+exp(α+βx))

さて、α+βxは、いままでに計算済みです
そこで、上の式に、さっき計算した2つの変数

upper95.logit.ci
lower95.logit.ci

を叩き込んで、確率の信頼区間を計算しましょう
それが、こんな感じです

> upper95.ci <- exp(upper95.logit.ci)/(1+exp(upper95.logit.ci))
> lower95.ci <- exp(lower95.logit.ci)/(1+exp(lower95.logit.ci))

言うまでもなく、この二つが、上限と下限の信頼区間のベクトルです


さて、つまんねえ計算が終わったので、上の結果を、予測確率と共に、グラフにしてみましょう。もちろん、x軸は、カブトガニの甲羅の幅ですよ

最初に、下限の信頼区間

> plot(crab.data$width[width.order],lower95.ci[width.order],xlim=c(21,34),ylim=c(0,1),xlab="",ylab="",col="blue",type="l")

上書きを許可
> par(new =T)

次に、上限の信頼区間

> plot(crab.data$width[width.order],upper95.ci[width.order],xlim=c(21,34),ylim=c(0,1),xlab="",ylab="",col="red",type="l")

上書きを許可

> par(new =T)

つづいて、予測確率をプロット

> plot(crab.data$width[width.order],crab.result$fitted.values
[width.order],xlim=c(21,34),ylim=c(0,1),xlab="Crab.Width",ylab="Probability",type="l",
+ main ="Ex. of Logistic Regression/ 95% of C.I.")

上書きを許可しておいて
> par(new =T)

最後に、カテゴリー化したデータから計算したサンプル確率をプロット
>plot(crab.category$width.cate,crab.category$SampleRatio,xlim=c(21,34),ylim=c(0,1),xlab="",ylab="",col="red")

で、出てきたのが、上のグラフです

赤:上限の95%信頼区間
青:下限の95%信頼区間
黒:予測確率
赤の点:カテゴリー化したデータから計算したサンプル確率

なんだか、えらい手間をかけたワリには、簡単なグラフですね
すでに、計算してあればいいのに、なんて思ってしまいますね

次回は、Devianceとかresidualsあたりを説明する予定です


=======================================================
なんだか、えらく長くなった

(参考文献)
カテゴリカルデータ解析入門
Alan Agresti
サイエンティスト社

のp.151あたりを計算

(感想)
データハンドリングが大変
アクセスとかエクセルなら、簡単なのになんて思ったりします
あと、Coefficient間の相関係数が、どうすれば出せるのかが
中々分からなかった。
やったことは大したことないのに、コマンドを調べたりするのは
みょーーーーに、大変だったのでした

なんか、先に、重回帰分析とかを、試してみればよかったかも
そんな気がしている

いずれにしても、まだまだ勉強中の身ですね
=======================================================

0 件のコメント:

コメントを投稿