======== Trabalho Final ========
==== Código ====
lmanal = function(dataf,var.res = colnames(dataf)[1]){
require("MuMIn") #requer o pacote MuMIn que contem a funcao AICc
#############################PREMISSAS#######################################
if(!is.data.frame(dataf)){ #verifica se dataf e um data.frame
stop(dataf,"\t nao e data frame") #para o scrip se dataf nao for data.frame
}
#######################ORGANIZANDO OS DADOS##################################
s = dim(dataf) #tamanho do data.frame
#reorganiza o data frame com var.res na primeira coluna
if(var.res!=colnames(dataf)[1]){ #verifica se a primeira coluna e a variavel resposta
if(is.character(var.res)){#verifica se a variavel resposta e string
teste_char=rep(NA,s[2])#cria um vetor para verificar se var.res e um nome valido
for(ii in 1:s[2]){#comeca o loop para teste de cada coluna
teste_char[ii]=identical(var.res,colnames(dataf)[ii])# teste
}
if(sum(teste_char)==1){#teste se alguma coluna contem var.res
flag=which(colnames(dataf)==var.res) #posicao da variavel resposta
}
else{#caso contrario para a funcao
stop("Escolha um nome ou numero de coluna valido")
}
}
else if(is.numeric(var.res)){ #se var.res for o numero da coluna
if(var.res<=s[2] && var.res>0){#caso a var.res seja um numero valido
flag=var.res#retira a posicao de ver.res
var.res=colnames(dataf)[flag] #atribui a var.res o nome da variavel resposta
}
else{#caso contrario para a funcao
stop("Escolha um nome ou numero de coluna valido")
}
}
else{#caso var.res nao seja numero nem caractere
stop("var.res deve ser o nome ou numero da coluna da variavel resposta")
}
if(flag==s[2]){#caso var.res seja a ultima coluna
dataf = data.frame(dataf[flag],dataf[1:(flag-1)])#organiza o data frame com var.res na primeira coluna
}else{#caso seja em qualquer outra coluna
dataf = data.frame(dataf[flag],dataf[1:(flag-1)],dataf[(flag+1):s[2]])#organiza o data frame com var.res na primeira coluna
}
}
if(class(dataf[,1])=="factor" || class(dataf[,1])=="logical"){# se var.res for fator ou logico lm() nao funciona
stop("A variavel resposta nao pode ser logica ou fator")#para a funcao
}
##########################RETIRANDO NAS######################################
if(sum(is.na.data.frame(dataf))!=0){ #retira os dados NA
linhas = unique(c(which(is.na.data.frame(dataf),arr.ind = T)[,1]))#cria um vetor contendo as linhas com NA
linhas_str = paste0(paste0(linhas[1:length(linhas)-1], ", ", collapse = ""),#transforma o vetor em string
linhas[length(linhas)],".",collapse = "")# com virgulas e ponto final
message(as.character(sum(is.na.data.frame(dataf))), #manda a mensagem ao usuario dizendo as linhas
" linhas contendo NA retiradas: ", #que serao retiradas
linhas_str)
dataf = na.omit(dataf) #retira os na's
}
#################PREPARANDO O MODELO COMPLETO################################
var.nomes = colnames(dataf) #nomes das variaveis
#cria o string que sera avaliado
var.nomes.list=as.list(rep(NA,s[2]-1))#cria uma lista vazia para receber os nomes das colunas
for(iii in 1:(s[2]-1)){#loop para preencher a lista com as combinaçoes necessarias para testar as possibilidades
if(iii!=s[2]-1){#caso nao seja a ultima coluna
var.nomes.list[[iii]]=c(var.nomes[(iii+1):s[2]])#nao e a ultima coluna
}
else{
var.nomes.list[[iii]]=c(var.nomes[s[2]])#ulima coluna
}
}
termos_char = data.frame(do.call(expand.grid,var.nomes.list))#cria a lista com as combinacoes possiveis com as variaveis
termos_char = t(termos_char) #transpoe o data frame
ndim=dim(termos_char)[2] #retira o numero de colunas
mod.vars = as.list(rep(NA,ndim)) #listas vazias que serao preenchidas com as
mod.formula=mod.vars #variaveis que vao compor a formula e as formulas em caracter
for(I in 1:ndim){#loop que completa as listas
mod.vars[[I]]=sort(unique(c(termos_char[,I])))#retira as variaveis redundantes
mdim=length(mod.vars[[I]])#retira o numero de variaveis preditoras nos modelos
if(mdim==1){#caso seja um modelo com apenas uma variavel preditora
mod.formula[[I]]=paste0(var.res,"~",mod.vars[[I]])#cria a formula
}
else if(mdim==2){#caso seja um modelo com duas variaveis preditoras
mod.formula[[I]]=paste0(var.res,"~",mod.vars[[I]][1],"+",mod.vars[[I]][2])#cria a formula
}
else{#caso seja um modelo com mais de duas variaveis preditoras
mod.formula[[I]]=paste0(var.res,"~",#cria a formula
paste0(mod.vars[[I]][1],
paste0("+",mod.vars[[I]][2:mdim],
collapse=""),collapse=""),collapse="")
}
}
mod.formula=unique(mod.formula)#retira as formulas de modelos redundantes
odim=length(mod.formula)#retira o numero de modelos a serem testados
aicc.vec = rep(NA,odim)#vetor que sera preenchido com os valores de AICc
for(II in 1:odim){#loop que preenche o vetor
aicc.vec[II]=AICc(lm(mod.formula[[II]],data=dataf))#calculo do modelo e respectivo AICc
}
best.fit=lm(mod.formula[[which.min(aicc.vec)]],data=dataf)#carrega o melhor modelo em best.fit
par(mfrow=c(2,2))#divide o ambiente grafico em 4
plot(best.fit)#plota o melhor modelo
print(summary(best.fit))#entrega as propriedades do melhor modelo
invisible(best.fit)#retorna o modelo em uma variavel caso o usuario deseje
}
==== Help ====
lmanal() R Documentation
Description:
Function the calculates the best linear model from all combinations of the variables from a data frame using the Second-order Akaike Information Criterion (AICc)
Usage:
lmanal = function(dataf,var.res = colnames(dataf)[1])
Arguments:
dataf a data frame class object containing the variables on which the linear model will be contructed
var.res character name or numeric value of the culumn of the data frame which the model will predict
Details:
var.res has to be a continuous value
Value:
if atributed to a variable returns a lm class object containing the linear model with the lower AICc value
prints the summary of the lm object
plots the lm object in a 2 by 2 graphic environment
Warning:
column names must not have any spaces or odd characters
Note:
uses the package "MuMIn" to load the AICc function
Author(s):
Luan Sayeg Michelazzo
References:
Burnham KP, Anderson DR. Practical use of the information-theoretic approach. InModel Selection and Inference 1998 (pp. 75-117). Springer, New York, NY
Burnham KP, Anderson DR, Huyvaert KP. AIC model selection and multimodel inference in behavioral ecology: some background, observations, and comparisons. Behavioral ecology and sociobiology. 2011 Jan 1;65(1):23-35.
Wagenmakers EJ, Farrell S. AIC model selection using Akaike weights. Psychonomic bulletin & review. 2004 Feb 1;11(1):192-6.
See Also:
lm(), "MuMIn" package
Examples:
l = lmanal(attitude)
lmanal(attitude,"complaints")
lmanal(attitude,2)