<<目次へ


最終更新日 : 2007.9.10

連続型変数とカテゴリカル変数を混在させる



p95のBOX6.1の解析例

> dat <- excel.w(3) # Excelからデータの読み込み
Read 90 items
# データフレームの作成
> Leprosy <- data.frame(TREATMT=as.factor(dat[,1]), BACBEF=dat[,2], BACAFTER=dat[,3])
> Leprosy
   TREATMT BACBEF BACAFTER
1        1  7.464    7.789
2        1  8.551    0.000
3        1 10.774    4.742
(途中省略)

> attach(Leprosy) # データフレームLeprosyにパスを通す
> box6.1 <- glm(BACAFTER ~ BACBEF + TREATMT)
> summary(aov(box6.1)) # 分散分析表
            Df Sum Sq Mean Sq F value    Pr(>F)    
BACBEF       1 587.48  587.48 40.1800 1.033e-06 ***
TREATMT      2  83.35   41.67  2.8502     0.076 .  
Residuals   26 380.15   14.62                      
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1 
> library(car) # carパッケージの呼び出し
> Anova(box6.1, test="F") # TypeIIの平方和
Anova Table (Type II tests)

Response: BACAFTER
              SS Df       F    Pr(>F)    
BACBEF    515.01  1 35.2238 2.912e-06 ***
TREATMT    83.35  2  2.8502     0.076 .  
Residuals 380.15 26                      
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1 
> summary(box6.1) # 係数表

Call:
glm(formula = BACAFTER ~ BACBEF + TREATMT)

Deviance Residuals: 
    Min       1Q   Median       3Q      Max  
-6.5177  -1.7218  -0.1963   2.2941   9.3728  

Coefficients:
            Estimate Std. Error t value Pr(>|t|)    
(Intercept)  -1.6026     1.8815  -0.852   0.4021    
BACBEF        0.8831     0.1488   5.935 2.91e-06 ***
TREATMT2      0.8641     1.7548   0.492   0.6265    
TREATMT3      3.9060     1.7326   2.254   0.0328 *  
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1 

(Dispersion parameter for gaussian family taken to be 14.62122)

    Null deviance: 1050.98  on 29  degrees of freedom
Residual deviance:  380.15  on 26  degrees of freedom
AIC: 171.32

Number of Fisher Scoring iterations: 2

> detach(Leprosy) # パスの解除


p96の図6.1の作図例

> attach(Leprosy)

# plot()を用いて処置1のデータをプロットする
> plot(BACBEF[TREATMT==1], BACAFTER[TREATMT==1],
+ xlim=c(0,25), ylim=c(0,20),
+ xlab="BACBEF", ylab="BACAFTER",
+ pch=18)

# points()を用いて処置2のデータを図に追加
> points(BACBEF[TREATMT==2], BACAFTER[TREATMT==2], pch=17)

# 同じく処置3のデータをプロット
> points(BACBEF[TREATMT==3], BACAFTER[TREATMT==3], pch=8)

> x <- seq(0, 25, 0.1) # 直線の描写につかうx軸の値
> model1 <- -1.6026 + 0.8831*x + 0 # モデル1のy軸の値
> points(x, model1, type="l") # モデル1の直線を描く
> model2 <- -1.6026 + 0.8831*x + 0.8641
> points(x, model2, type="l", lty=2)
> model3 <- -1.6026 + 0.8831*x + 3.9060
> points(x, model3, type="l", lty=3)

> # 直線の凡例
> legend(17, 5, # 凡例を書く座標
+         c("model1", "model2", "model3"), # 凡例のラベル
+         lty=c(1, 2, 3), # 凡例のラインのスタイル
+ )

> # 点の凡例
> legend(0, 20,
+ c("treatmt1", "treatmt2", "treatmt3"),
+ pch=c(18, 17, 8) # 点のスタイル
+ )

> detach(Reprosy)


p98のBOX 6.2の解析例および図の描写

# データフレームの作成
> fats <- data.frame(WEIGHT=dat[,1], FAT=dat[,2], SEX=as.factor(dat[,3]))
> fats
   WEIGHT FAT SEX
1      89  28   2
2      88  27   2
3      66  24   2
4      59  23   2
(途中省略)
> attach(fats) # データフレームfatsにパスを通す
> box6.2 <- glm(FAT ~ WEIGHT + SEX) # 一般化線形モデルとして解析
> summary(aov(box6.2)) # 分散分析表の出力
            Df  Sum Sq Mean Sq F value    Pr(>F)    
WEIGHT       1   1.328   1.328  0.5184    0.4819    
SEX          1 176.098 176.098 68.7293 3.482e-07 ***
Residuals   16  40.995   2.562                      
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1 
> library(car) # carパッケージの呼び出し
> Anova(box6.2, test="F") # type2の平方和
Anova Table (Type II tests)

Response: FAT
               SS Df      F    Pr(>F)    
WEIGHT     87.105  1 33.996 2.556e-05 ***
SEX       176.098  1 68.729 3.482e-07 ***
Residuals  40.995 16                     
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

# 男性のデータポイントをプロット
> plot(WEIGHT[SEX==1], FAT[SEX==1],
+ xlim=c(50,100), ylim=c(20,40),
+ xlab="体重", ylab="脂肪量", pch=18)
# 女性のデータポイントを追加
> points(WEIGHT[SEX==2], FAT[SEX==2], pch=15)
> summary(box6.2) #係数表の出力

Call:
glm(formula = FAT ~ WEIGHT + SEX)

Deviance Residuals: 
    Min       1Q   Median       3Q      Max  
-3.7740  -0.7760  -0.2532   0.8698   3.0546  

Coefficients:
            Estimate Std. Error t value Pr(>|t|)    
(Intercept) 16.96228    2.41021   7.038 2.80e-06 ***
WEIGHT       0.21715    0.03724   5.831 2.56e-05 ***
SEX2        -7.90375    0.95337  -8.290 3.48e-07 ***
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1 

(Dispersion parameter for gaussian family taken to be 2.562192)

    Null deviance: 218.421  on 18  degrees of freedom
Residual deviance:  40.995  on 16  degrees of freedom
AIC: 76.531

Number of Fisher Scoring iterations: 2

> x <- seq(50, 100, 0.1) # x軸のデータ
> men <- 16.96228 + 0.21715*x + 0 # 男性のy軸のデータ
> women <- 16.96228 + 0.21715*x - 7.90375 # 女性のy軸のデータ
> points(x, men, type="l") # 男性のデータポイントへの直線の当てはめ
> points(x, women, type="l") # 女性も同様
> detach(fats) # パスの解除


 ここまで繰り返しRのglm()を使用して解析してきたので、そろそろ解析する変数が異なっても、それに対応してRでデータ解析をすることが可能であろう。そんなわけで、これ以降は新しい解析例や特に難しい(分かりにくい)解析例以外は各自でやってみてほしい。どのような解析であっても、glm()の使い方は基本的に同じであるから、今までの章についてのRでの解析例を読み返せば分かるはずである。したがって、練習問題も教科書の解答を見ながらやればRでも必ず解析できるので、練習問題の補足を書くことはしない。どうしても分からない部分があれば、このwebサイトに併設してある掲示板なりで聞いてもらえれば対応するつもりである。