# Fit All K-way Models in a GLM

`Kway.Rd`

Generate and fit all 0-way, 1-way, 2-way, ... k-way terms in a glm.

This function is designed mainly for hierarchical
loglinear models (or `glm`

s
in the poisson family), where it is desired to find the
highest-order terms necessary to achieve a satisfactory fit.

Using `anova`

on the resulting `glmlist`

object will then give sequential tests of the pooled contributions of
all terms of degree \(k+1\) over and above those of degree \(k\).

This function is also intended as an example of a generating function
for `glmlist`

objects, to facilitate model comparison, extraction,
summary and plotting of model components, etc., perhaps using `lapply`

or similar.

## Arguments

- formula
a two-sided formula for the 1-way effects in the model. The LHS should be the response, and the RHS should be the first-order terms connected by

`+`

signs.- family
a description of the error distribution and link function to be used in the model. This can be a character string naming a family function, a family function or the result of a call to a family function. (See

`family`

for details of family functions.)- data
an optional data frame, list or environment (or object coercible by

`as.data.frame`

to a data frame) containing the variables in the model. If not found in data, the variables are taken from`environment(formula)`

, typically the environment from which`glm`

is called.- ...
Other arguments passed to

`glm`

- order
Highest order interaction of the models generated. Defaults to the number of terms in the model formula.

- prefix
Prefix used to label the models fit in the

`glmlist`

object.

## Details

With `y`

as the response in the `formula`

, the 0-way (null) model
is `y ~ 1`

.
The 1-way ("main effects") model is that specified in the
`formula`

argument. The k-way model is generated using the formula
`. ~ .^k`

.
With the default `order = nt`

, the final model is the saturated model.

As presently written, the function requires a two-sided formula with an explicit
response on the LHS. For frequency data in table form (e.g., produced by `xtabs`

)
you the `data`

argument is coerced to a data.frame, so you
should supply the `formula`

in the form `Freq ~ `

....

## Value

An object of class `glmlist`

, of length `order+1`

containing the 0-way, 1-way, ...
models up to degree `order`

.

## Examples

```
## artificial data
factors <- expand.grid(A=factor(1:3), B=factor(1:2), C=factor(1:3), D=factor(1:2))
Freq <- rpois(nrow(factors), lambda=40)
df <- cbind(factors, Freq)
mods3 <- Kway(Freq ~ A + B + C, data=df, family=poisson)
LRstats(mods3)
#> Likelihood summary table:
#> AIC BIC LR Chisq Df Pr(>Chisq)
#> kway.0 240.09 241.67 39.097 35 0.2909
#> kway.1 242.97 252.47 31.978 30 0.3686
#> kway.2 241.60 263.77 14.613 22 0.8783
#> kway.3 246.37 274.87 11.377 18 0.8777
mods4 <- Kway(Freq ~ A + B + C + D, data=df, family=poisson)
LRstats(mods4)
#> Likelihood summary table:
#> AIC BIC LR Chisq Df Pr(>Chisq)
#> kway.0 240.09 241.67 39.097 35 0.2909
#> kway.1 243.51 254.60 30.522 29 0.3883
#> kway.2 248.01 279.68 9.019 16 0.9126
#> kway.3 264.64 315.31 1.649 4 0.8000
#> kway.4 270.99 328.00 0.000 0 1.0000
# JobSatisfaction data
data(JobSatisfaction, package="vcd")
modSat <- Kway(Freq ~ management+supervisor+own, data=JobSatisfaction,
family=poisson, prefix="JobSat")
LRstats(modSat)
#> Likelihood summary table:
#> AIC BIC LR Chisq Df Pr(>Chisq)
#> JobSat.0 260.251 260.330 208.775 7 <2e-16 ***
#> JobSat.1 175.472 175.790 117.997 4 <2e-16 ***
#> JobSat.2 63.541 64.097 0.065 1 0.7989
#> JobSat.3 65.476 66.111 0.000 0 <2e-16 ***
#> ---
#> Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
anova(modSat, test="Chisq")
#> Analysis of Deviance Table
#>
#> Model 1: Freq ~ 1
#> Model 2: Freq ~ management + supervisor + own
#> Model 3: Freq ~ management + supervisor + own + management:supervisor +
#> management:own + supervisor:own
#> Model 4: Freq ~ management + supervisor + own + management:supervisor +
#> management:own + supervisor:own + management:supervisor:own
#> Resid. Df Resid. Dev Df Deviance Pr(>Chi)
#> 1 7 208.775
#> 2 4 117.997 3 90.778 <2e-16 ***
#> 3 1 0.065 3 117.932 <2e-16 ***
#> 4 0 0.000 1 0.065 0.7989
#> ---
#> Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
# Rochdale data: very sparse, in table form
data(Rochdale, package="vcd")
if (FALSE) {
modRoch <- Kway(Freq~EconActive + Age + HusbandEmployed + Child +
Education + HusbandEducation + Asian + HouseholdWorking,
data=Rochdale, family=poisson)
LRstats(modRoch)
}
```