[R-br] Contraste com glm com distribuição de poisson em um fatorial 2x2

walmes . walmeszeviani em gmail.com
Sexta Maio 9 12:14:13 BRT 2014


Alexandre,

Existe uma lógica que pode ser considerada para montar esses contrastes
corretamente. A lógica não é difícil, por outro lado, montar as matrizes de
contraste "na mão" é demorado, sujeito à erros, não prontamente adaptável à
outros experimentos. Com a experiência eu desenvolvi um jeito mais mínimo
reproduzível de fazer. Para experimento fatoriais com perda de caselas
(combinação de níveis) esse código deve ser modificado.

##-----------------------------------------------------------------------------

require(multcomp)
require(doBy)
require(latticeExtra)

## apc: build all pairwise comparisons matrix by a LSmatrix.
source("http://dl.dropboxusercontent.com/u/48140237/apc.R")

##-----------------------------------------------------------------------------

d <- data.frame(a=factor(sample(c('atacado','sadio'), 100, rep=TRUE)),
                b=factor(sample(c('48','72','96'), 100, rep=TRUE)),
                c= factor(sample(c('TY01','VM06'), 100, rep=TRUE)))

xtabs(~a+b+c, d)

d$y <- rpois(nrow(d), lambda=10)

## Interação.
d$abc <- interaction(d$a, d$b, d$c)
levels(d$abc)

## O padrão de funcionamento faz assim, o primeiro fator troca níveis
## dentro do segundo que troca níveis dentro do terceiro, etc, veja.
do.call(rbind, strsplit(levels(d$abc), "\\."))

## Sabendo disso você pode passar da a, b e c na forma que lhe for mais
## conveniente. Por outro lado, é desperdício de tempo operar assim
## porque eu considero mais fácil declarar o modelo fatorial, usar a
## LSmatrix para gerar a matriz de contraste e usá-la.

g0 <- glm(y~a*b*c, family="poisson", data=d)
g1 <- glm(y~0+abc, family="poisson", data=d)

M <- LSmatrix(g0, effect=c("a","b","c"))
M

## As estimativas das médias (na escala do preditor linear).
data.frame(g0=M%*%coef(g0), g1=coef(g1))

## Combinações de níveis correspondentes as médias.
str(M)
grid <- attr(M, "grid")

## Matriz de contrastes entre níveis de `focus` dentro dos níveis de
## `split`.
split <- c("b","c")
focus <- "a"
spl <- interaction(grid[,split])
i <- 1:nrow(grid)
l <- split(i, f=spl)
contr <- lapply(l,
                function(row){
                    ## Matriz de contrastes par a par.
                    a <- apc(M[row,], lev=levels(d[,focus]))
                    ## Prefixo no nome das linhas.
                    rownames(a) <- paste(spl[row[1]],
                                         rownames(a), sep="/")
                    return(a)
                })
contr <- do.call(rbind, contr)
contr

## Constrastes.
summary(glht(g0, linfct=contr),
        test=adjusted(type="fdr"))

## Para ter a contra prova da equivalência dos procedimentos.
cntrMat <- rbind("atacado.48.TY01-sadio.48.TY01"=c(
                     1, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0))
summary(glht(g1, linfct=cntrMat),
        test=adjusted(type="fdr"))

##-----------------------------------------------------------------------------
## No caso de desdobrar interação dupla.

M <- LSmatrix(g0, effect=c("a","b"))
grid <- attr(M, "grid")

## Matriz de contrastes entre níveis de `focus` dentro dos níveis de
## `split`.
split <- c("b")
focus <- "a"
spl <- interaction(grid[,split])
i <- 1:nrow(grid)
l <- split(i, f=spl)
contr <- lapply(l,
                function(row){
                    ## Matriz de contrastes par a par.
                    a <- apc(M[row,], lev=levels(d[,focus]))
                    ## Prefixo no nome das linhas.
                    rownames(a) <- paste(spl[row[1]],
                                         rownames(a), sep="/")
                    return(a)
                })
contr <- do.call(rbind, contr)
contr

## Constrastes.
summary(glht(g0, linfct=contr),
        test=adjusted(type="fdr"))

##-----------------------------------------------------------------------------
## Representando em um gráfico média com IC.

grid <- attr(M, "grid")
grid <- sapply(grid, function(x) if(is.character(x)) factor(x) else x)
means <- confint(glht(g0, linfct=M), calpha=univariate_calpha())
grid <- cbind(data.frame(grid), means$confint)
str(grid)

segplot(a~lwr+upr|b, data=grid, draw=FALSE, centers=Estimate)

##-----------------------------------------------------------------------------

À disposição.
Walmes.
-------------- Próxima Parte ----------
Um anexo em HTML foi limpo...
URL: <http://listas.inf.ufpr.br/pipermail/r-br/attachments/20140509/9096344f/attachment.html>


Mais detalhes sobre a lista de discussão R-br