[R] Generating model formulas for all k-way terms
Michael Friendly
friendly at yorku.ca
Tue Apr 13 19:17:33 CEST 2010
Beautiful! And thanks for the clean-up
-Michael
Heather Turner wrote:
> Hi Michael,
>
> You need to substitute the value of i for the symbol i in your formula, i.e.
>
> update(mod, substitute(.~.^i, list(i = i)))
>
> So, with some other tidying up:
>
> Kway <- function(formula, family, data, ..., order=nt) {
> models <- list()
> mod <- glm(formula, family, data, ...)
> mod$call$formula <- formula
> terms <- terms(formula)
> tl <- attr(terms, "term.labels")
> nt <- length(tl)
> models[[1]] <- mod
> for(i in 2:order) {
> models[[i]] <- update(mod, substitute(.~.^p, list(p = i)))
> } # null model
> mod0 <- update(mod, .~1)
> models <- c(list(mod0), models)
> names(models) <- paste("mod", 0:order, sep = ".")
> class(models) <- "glmlist"
> models
> }
>
> mods <- Kway(Freq ~ A + B + C, data=df, family=poisson)
>
> Best wishes,
>
> Heather
>
> Michael Friendly wrote:
>
>> For the vcdExtra package, I'm exploring methods to generate and fit
>> collections of glm models,
>> and handling lists of such model objects, of class "glmlist". The
>> simplest example is fitting all
>> k-way models, from k=0 (null model) to the model with the highest-order
>> interaction. I'm
>> having trouble writing a function, Kway (below) to do what is done in
>> the example below
>>
>>
>>> factors <- expand.grid(A=1:3, B=1:2, C=1:3)
>>> Freq <- rpois(nrow(factors), lambda=40)
>>> df <- cbind(factors, Freq)
>>>
>>> mod.0 <- glm(Freq ~ 1, data=df, family=poisson)
>>> mod.1 <- update(mod.0, . ~ A + B + C)
>>> mod.2 <- update(mod.1, . ~ .^2)
>>> mod.3 <- update(mod.1, . ~ .^3)
>>>
>>> library(vcdExtra)
>>> summarize(glmlist(mod.0, mod.1, mod.2, mod.3))
>>>
>> Model Summary:
>> LR Chisq Df Pr(>Chisq) AIC
>> mod.0 21.3310 17 0.2118 -12.6690
>> mod.1 21.1390 14 0.0981 -6.8610
>> mod.2 15.8044 11 0.1485 -6.1956
>> mod.3 14.7653 10 0.1409 -5.2347
>>
>> # Generate and fit all 1-way, 2-way, ... k-way terms in a glm
>>
>> Kway <- function(formula, family, data, ..., order=nt) {
>> models <- list()
>> mod <- glm(formula, family, data, ...)
>> terms <- terms(formula)
>> tl <- attr(terms, "term.labels")
>> nt <- length(tl)
>> models[[1]] <- mod for(i in 2:order) {
>> models[[i]] <- update(mod, .~.^i)
>> } # null model
>> mod0 <- update(mod, .~1)
>> models <- c(mod0, models) class(models) <- "glmlist"
>> models
>> }
>>
>>
>>> mods <- Kway(Freq ~ A + B + C, data=df, family=poisson)
>>>
>> Error in terms.formula(tmp, simplify = TRUE) : invalid power in formula
>>
>> I still don't understand how to manipulate formulas in functions. Can
>> someone help?
>>
>>
--
Michael Friendly Email: friendly AT yorku DOT ca
Professor, Psychology Dept.
York University Voice: 416 736-5115 x66249 Fax: 416 736-5814
4700 Keele Street http://www.math.yorku.ca/SCS/friendly.html
Toronto, ONT M3J 1P3 CANADA
More information about the R-help
mailing list