boxcox.bino <- function(modelo=fit.model,var=stop("faltou informar a variavel"),tetas=seq(-2,2,0.1),maxit=20) { # # Descrição e detalhes: # Esta função ajusta o modelo com distribuição Binomial (ligação logito, probito, cloglog ou Aranda-Ordaz) testando # qual o teta da transformação Box-Cox [(var^teta)/teta, teta!=0 e log(var), teta==0] diminui mais o desvio. # # A sugestão desse procedimento é feita por McCullagh e Nelder (pág.402, teoria e pág.412, exemplo). # # Por motivos óbvios deve-se analisar se a variável possui valores negativos ou iguais a zero ao se escolhar os tetas. # # Os dados devem estar disponíveis pelo comando attach( ). # # Argumentos obrigatórios: # modelo: deve-se informar o objeto onde está o ajuste do modelo com distribuição Binomial, sendo que este ajuste # não deve conter a variável que se está testando qual o melhor teta da transformação de Box-Cox; # var: é a variável que será avaliada qual o melhor teta da transformação de Box-Cox. # # Argumentos opcionais: # tetas: permite determinar quais tetas se deseja avaliar o desvio, o padrão é seq(-2,2,0.1); # maxit: máximo de iterações permitido para o processo iterativo convergir, o padrão é 20. # # Autor: Frederico Zanqueta Poleto , arquivo disponível em http://www.poleto.com # # Referência: # MCCULLAGH, P. e NELDER, J. A. (1989). Generalized Linear Models. 2ª ed. Chapman and Hall, London. # # Exemplo: # boxcox.bino(ajuste,seq(-0.1,0.6,0.01)) # if(class(modelo)[1] != "glm") { stop(paste("\nA classe do objeto deveria ser glm e nao ",class(modelo),"!!!\n")) } if(modelo$family[[1]] != "Binomial" & modelo$family[[1]] != "binomial" & modelo$family[[1]] != "Aranda") { stop(paste("\nA familia do objeto deveria ser Binomial ou Aranda-Ordaz e nao ",modelo$family[[1]],"!!!\n")) } X <- model.matrix(modelo) n <- nrow(X) if(is.null(modelo$prior.weights)) { ntot<-rep(1,n) } else { ntot<-modelo$prior.weights } y <- round(modelo$y*ntot,0) link<-modelo$family["link"] if ( modelo$family[[1]] == "Aranda" ) { alpha<-as.numeric(link) } nt<-length(tetas) devi<-numeric(nt) for(i in 1:nt) { if (tetas[i]==0) { h<-log(var) } else { h<-(var^tetas[i]-1)/tetas[i] } X2<-cbind(X,h) if ( (is.null(version$language) == T && link == "Logit: log(mu/(1 - mu))") | (is.null(version$language) == F && link == "logit") ) { fit <- glm(cbind(y,ntot-y) ~ X2-1,family=binomial,maxit=maxit) } else { if ( (is.null(version$language) == T && link == "Probit: qnorm(mu)") | (is.null(version$language) == F && link == "probit") ) { fit <- glm(cbind(y,ntot-y) ~ X2-1,family=binomial(link=probit),maxit=maxit) } else { if ( (is.null(version$language) == T && link == "Complementary Log: log( - log(1 - mu))") | (is.null(version$language) == F && link == "cloglog") ) { fit <- glm(cbind(y,ntot-y) ~ X2-1,family=binomial(link=cloglog),maxit=maxit) } else { if ( modelo$family[[1]] == "Aranda" ) { fit <- do.call("glm",list(cbind(y,ntot-y) ~ X2-1,family=aranda(alpha),maxit=maxit)) } else { stop(paste("\nEsta funcao so aceita as ligacoes: logito, probito, complementar log-log e Aranda-Ordaz !!!\nLigacao ",link," desconhecida!!!\n")) } } } } devi[i]<-deviance(fit) } plot(tetas,devi,xlab="teta", ylab="desvio",type="l",pch=16,lwd=1) cat("\nDo conjunto\n") print(tetas) cat(", o que minimizou o desvio foi:\n") tetas[order(devi)[1]] }