[R] Ordinal categorical data with GLM

Andrew Criswell arc at arcriswell.com
Thu Apr 11 18:41:27 CEST 2002


Hello All:

I am trying to replicate the results of an example found in Alan 
Agresti's "Categorical Data Analysis" on pages 267-269. The example is 
one of a 2 x 2 cross-classification table of ordinal counts: job 
satisfaction and income.

I am able to get Agresti's results for the independence model (G^2 = 
12.03 with df = 9) assuming as he does that the data is nominal, but I'm 
unable to derive his model of uniform association (linear-by-linear 
association, p. 263-269) for which he gets a value of G^2 = 2.39 with df 
= 8.

The observed data is represented by table 8.2 on page 268 as follows:

 > Freq <- c(20, 24,  80,  82,
+           22, 38, 104, 125,
+           13, 28,  81, 113,
+            7, 18,  54,  92)
 >
 > data.3 <- t(matrix(Freq, nrow = 4))
 >
 > list.3 <- list(Income       = c("< 6,000",
+                                 "6,000-15,000",
+                                 "15,000-25,000",
+                                 "> 25,000"),
+                Satisfaction = c("Very dissatisfied",
+                                 "Little dissatisfied",
+                                 "Moderately satisfied",
+                                 "Very satisfied"))
 >
 > dimnames(data.3) <- list.3
 >
 > ftable(data.3)
              Satisfaction Very dissatisfied Little dissatisfied 
Moderately satisfied Very satisfied
Income                                                                                              

< 6,000                                   20                  
24                   80             82
6,000-15,000                              22                  
38                  104            125
15,000-25,000                             13                  
28                   81            113
 > 25,000                                   7                  
18                   54             92
 >

I am able to obtain Agresti's results for the independence model which 
assumes the data is nominal, not ordinal, using either glm() or loglm().

 > library(MASS)
 > options(contrasts=c("contr.sum", "contr.poly"))
 >
 > X <- as.integer(gl(4, 4, 16)) - 1
 > Y <- as.integer(gl(4, 1, 16)) - 1
 >
 > data.2 <- data.frame(Freq, X = factor(X), Y = factor(Y))
 >
 > summary(fm3 <- glm(Freq ~ X + Y, data = data.2,
+                    family = poisson()))

Call:
glm(formula = Freq ~ X + Y, family = poisson(), data = data.2)

Deviance Residuals:
     Min        1Q    Median        3Q       Max 
-1.50416  -0.67501  -0.08592   0.53800   1.51852 

Coefficients:
            Estimate Std. Error z value Pr(>|z|)   
(Intercept)  3.74425    0.04444  84.259  < 2e-16 ***
X1          -0.07101    0.05982  -1.187    0.235   
X2           0.26754    0.05368   4.984 6.22e-07 ***
X3           0.06070    0.05726   1.060    0.289   
Y1          -1.02174    0.09995 -10.222  < 2e-16 ***
Y2          -0.46674    0.08101  -5.761 8.35e-09 ***
Y3           0.61632    0.05917  10.416  < 2e-16 ***
---
Signif. codes:  0 `***' 0.001 `**' 0.01 `*' 0.05 `.' 0.1 ` ' 1

(Dispersion parameter for poisson family taken to be 1)

    Null deviance: 445.763  on 15  degrees of freedom
Residual deviance:  12.037  on  9  degrees of freedom
AIC: 115.07

Number of Fisher Scoring iterations: 3

 > dummy.coef(fm3)
Full coefficients are
                                                              
(Intercept):       3.744253                                   
X:                        0           1           2           3
                -0.07101181  0.26753870  0.06069753 -0.25722441
Y:                        0           1           2           3
                 -1.0217353  -0.4667389   0.6163210   0.8721532
 >
 > fm4 <- loglm(Freq ~ X + Y, data = data.2, param = T, fit = T)
 > fm4;  fm4$param
Call:
loglm(formula = Freq ~ X + Y, data = data.2, param = T, fit = T)

Statistics:
                      X^2 df  P(> X^2)
Likelihood Ratio 12.03686  9 0.2112391
Pearson          11.98857  9 0.2139542
$"(Intercept)"
[1] 3.744253

$X
          0           1           2           3
-0.07101181  0.26753871  0.06069753 -0.25722443

$Y
         0          1          2          3
-1.0217356 -0.4667388  0.6163211  0.8721533

 >

My question is this:  can glm() or some other function be used in the 
manner Agresti employed for ordinal count data?

Thank you,
ANDREW

Andrew Criswell
Professor of Finance
Graduate School
Bangkok University


-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-
r-help mailing list -- Read http://www.ci.tuwien.ac.at/~hornik/R/R-FAQ.html
Send "info", "help", or "[un]subscribe"
(in the "body", not the subject !)  To: r-help-request at stat.math.ethz.ch
_._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._



More information about the R-help mailing list