normal<-function(x, transf="todos", teste="SW", colu)
{
library(plyr) #biblioteca para a utilização da função arrange.
#######################
#transformações
######################
lg<-log(x) #logaritimo
sq<-sqrt(x) #raiz quadrada
cub<-x^1/3 #raiz cubica
inv<-1/x #inverso
media<-mean(x)/x #percentual da media
#######################3
#Criando lista com as transformações
####################
trans<-list(lg,sq, cub,inv, media)
names(trans)<-c("log","Rquadrada","Rcubica","inverso","media")
################################
#Testes de normalidade
################################
if(teste=="SW") #testes de Shapiro-Wilk para cada uma das transformações realizadas
{
plg<-shapiro.test(lg)
psq<-shapiro.test(sq)
pcub<-shapiro.test(cub)
pinv<-shapiro.test(inv)
pmedia<-shapiro.test(media)
}
if(teste=="KS") #testes de Kolmogorov-Smirnov para cada uma das transformações realizadas
{
plg<- ks.test(unique(lg), "pnorm", mean(lg),sd(lg))
psq<-ks.test(unique(sq),"pnorm", mean(sq), sd(sq))
pcub<-ks.test(unique(cub),"pnorm", mean(cub), sd(cub))
pinv <-ks.test(unique(inv),"pnorm", mean(inv), sd(inv))
pmedia <-ks.test(unique(media),"pnorm", mean(media), sd(media))
}
if(transf=="todos")
{
escolha<-c(plg$p.value, psq$p.value, pcub$p.value, pinv$p.value, pmedia$p.value) #string com os valores de p encontrado no SWtest
tipos<-c("lg", "sq", "cub", "inv", "media") #string com os nomes das transformações realizadas
te<-data.frame(tipos) #criando data frame com os nomes das transformações
te[,2]<-data.frame(escolha) #incluindo o p encontrado
te<-arrange(te, desc(escolha)) #organizando em ordem decrescente os valores de p encontrados
melhor<-te[1,1] #obtendo o nome do teste cujo p apresenta maior chance da hipótese nula do SWtest ser verdadeiro
######################################
#Histogramas, curvas de densidade e curva normal dos dados transformados
##################################
x11() #janela grafica
par(mfrow=c(3,2)) #janela com 3 linhas e 2 colunas
for (i in names(trans)) #loop para contrução de gráficos
{
hist(trans[[i]], probability = T, main=i, xlab = i)
lines(density(trans[[i]]), col="blue", lwd=2) #densidade estimada da amostra transformada
curve(dnorm(x, mean=mean(trans[[i]]), sd=sd(trans[[i]])), add=T, col="red") #curva padrão para media e DP da amostra transformada
legend("topright", c("Densidade estimada","Curva padrão"), fill=c("blue","red"), horiz=F, cex=0.7)
}
par(mfrow=c(1,1))
##########################################
#Bloco output melhor transformação
#########################################
#se a transformação pela raiz quadrada for melhor
if (melhor=="sq")
{
cat( "\n A matrix com os dados transformados está armazenada na variável de nome sq")
cat("\n A transformação pela Raiz Quadrada foi a que apresentou melhor resultado no teste de normalização com p de ")
sq<<-sq
return(psq$p.value)
}
#se a transformação pela raiz cubica for melhor
if (melhor=="cub")
{
cat( "\n A matrix com os dados transformados está armazenada na variável de nome cub")
cat("\n A transformação pela Raiz Cúbica foi a que apresentou melhor resultado no teste de normalização com p de ")
cub<<-cub
return(pcub$p.value)
}
#se a transformação logaritmica for melhor
if (melhor=="lg")
{
cat( "\n A matrix com os dados transformados está armazenada na variável de nome lg")
cat("\n A transformação logarítimica foi a que apresentou melhor resultado no teste de normalização com p de ")
lg<<-lg
return(plg$p.value)
}
#se a inversão for melhor
if (melhor=="inv")
{
cat( "\n A matrix com os dados transformados está armazenada na variável de nome inv")
cat("\n A transformação pela Inversão foi a que apresentou melhor resultado no teste de normalização com p de ")
inv<<-inv
return(inv$p.value)
}
#se a normalização pela media for melhor
if (melhor=="media")
{
cat( "\n A matrix com os dados transformados está armazenada na variável de nome media")
cat("\n A transformação pela Média foi a que apresentou melhor resultado no teste de normalização com p de ")
media<<-media
return(psq$p.value)
}
##############################################
}
######################################
#Escolha da transformações
##################################
#função para criação de histogramas da transformação escolhida
his<-function(w,z)
{
x11()
par(mfrow=c(1,1))
hist(w, probability = T, xlab=z, main = z)
lines(density(w), col="blue", lwd=2) #densidade estimada da amostra transformada
curve(dnorm(x, mean=mean(w), sd=sd(w)), add=T, col="red")
legend("topright", c("Densidade estimada","Curva padrão"), fill=c("blue","red"), horiz=F, cex=0.7)
}
#Criação da variável, histograma e demonstração do p encontrado para a transformação escolhida
if(transf=="sq")
{
cat("\n A transformação pela Raiz Quadrada foi escolhida, com a matriz transformada armazenada na variável sq e o teste de normalização com p de ")
his(sq, "raiz quadrada")
sq<<-sq
return(psq$p.value)
}
if(transf=="inv")
{
cat("\n A transformação pelo Inverso foi escolhida, com a matriz transformada armazenada na variável inv e o teste de normalização com p de ")
his(inv, "inverso")
inv<<-inv
return(pinv$p.value)
}
if(transf=="media")
{
cat("\n A transformação pela Razão da Média foi escolhida, com a matriz transformada armazenada na variável media e o teste de normalização com p de ")
his(media, "media")
media<<-media
return(pmedia$p.value)
}
if(transf=="lg")
{
cat("\n A transformação logarítmica foi escolhida, com a matriz transformada armazenada na variável lg e o teste de normalização com p de ")
his(lg, "log")
lg<<-lg
return(plg$p.value)
}
if(transf=="cub")
{
cat("\n A transformação pela Raiz Cúbica foi escolhida, com a matriz transformada armazenada na variável cub e o teste de normalização com p de ")
his(cub, "raiz cúbica")
cub<<-cub
return(pcub$p.value)
}
}
Help
normal{stats} R Documentation
Descrição:
Função para normalizar dados de uma matriz, com opção de testar quais das transformações possíveis apresentam maior chance de produzir uma matriz normal. Será apresentado um histograma com a matriz transformada e linhas da densidade estimada e a curva normal para a uma amostra hipotética com a média e desvio padrão da amostra transformada.
Uso:
normal(x, transf="todos", teste="SW")
Argumentos:
x: uma matriz de dados numéricos
transf: Transformação a ser realizada. "sq" - Raiz quadrada, "cub" - Raiz cúbica, "inv" - inverso do número, "lg" - Transformação logarítmica, "media" - Razão pela média do total, "todos" - Todas as transformações anteriores serão realizadas e a que apresentar a maior chance da transformação apresentar uma distribuição normal será escolhida.
teste: Escolha de qual teste de normalidade será utilizado. "SW" - Teste de Shapiro-Wilk. "KS" - Teste de kolmogorov-Smirnov.
Detalhes:
A função deverá ser alimentada com uma matriz de uma linha, onde estarão os valores a ser transformados e analizados.
Valores
Será retornada uma variável contendo a matriz transformada e o(s) gráfico(s) de distribuição e o p do teste de normalizade.
Autor
Raymond Sehiji Takiguchi
Referência.
Ausente
Exemplos
#Obtém uma matriz com a transformação que tem a maior chance de apresentar distribuição normal utilizando-se do teste de Shapiro-Wilk
x<-matrix(iris[,2])
normal(x)
#Obtém uma matriz com tranformação logaritmica e teste de Kolgoromov-Smirnov
x<-matrix(iris[,2])
normal(x, transf="lg", teste="KS")