Geral : Aplicar técnicas multivariadas em um conjunto de dados sobre hipertensão.
Específicos :
Denomina-se Análise de Cluster ou Análise de Agrupamentos o conjunto de técnicas utilizadas na identificação de padrões de comportamento em bancos de dados através da formação de grupos homogêneos. O objetivo da analise de cluster é agrupar objetos ou variáveis semelhantes de forma que cada grupo seja homogêneo internamente e sejam diferentes entre si.
Árvores de Decisão são extremamente úteis para revelar de forma simples, estruturas que são extremamente complexas. O pacote R dispõe de duas funções para o ajuste de árvores de decisão: tree e rpart.
Pela função rpart é possível construir árvores de decisão no mesmo espírito descrito em Breiman et al. (1984) na monografia CART (Classification and Regression Trees).
Este problema envolve um grande número de covariáveis e, portanto, uma das maiores dificuldades está na seleção do conjunto de preditoras. Métodos do tipo stepwise, embora sejam atraentes na prática podem conduzir à modelos enganosos.
A tarefa aqui, é integrar à construção do modelo a intervenção dos especialistas na área. Então um passo no processo iterativo de seleção de variáveis é retirar preditoras selecionadas automaticamente que não tenham sentido, de acordo com opinião especializada.
Neste trabalho será realizada somente a análise linear discriminante (LDA). Outros tipos de análise discriminante são: QDA(Quadratic Discriminant Analysis), FDA(Flexible Discriminant Analysis), PDA(Penalized Discriminant Analysis) e MDA(Mixture Discriminant Analysis). A função lda() presente no pacote MASS do R realiza análise linear discriminante. É importante notar que para a construção da função linear discriminante os preditores devem ser quantitativos e assume-se matrizes de covariância iguais nos grupos.
Apesar de todo mito que envolve o uso de Redes Neurais Artificiais, o que está por trás desta técnica é a utilização de modelos não-lineares. Redes Neurais Artificiais para classificação estão implementadas no pacote nnet() presente na biblioteca MASS do R. A construção de uma rede neural associa-se a definição de sua topologia que no caso das redes do tipo feed-forward envolve a definição de 3 ou mais camadas. A primeira camada, chamada de camada de entrada necessita de tantos neurônios quanto forem o número de variáveis independentes, enquanto a última camada, denominada camada de saída, apresenta tantos neurônios quantas forem as variáveis resposta. Entre estas duas camadas podem existir uma ou mais camadas intermediárias, chamadas de camadas escondidas. O Teorema de Kolmogorov garante que uma camada escondida é suficiente para aproximar qualquer relação não-linear entre a resposta e as variáveis independentes, desde que satisfeitas algumas condições.
Os desempenhos de diferentes métodos para a classificação são usualmente comparados por intermédio de experimentos de validação cruzada com 10-dobras. Estes consistem em utilizar 90% dos dados para treinamento e 10% para teste. Os métodos passam por aprendizado supervisionado utilizando a chamada amostra de treinamento composta pelos dados selecionados com esta finalidade e o ajuste final é testado na amostra de teste.
# pacotes necessarios
require(MASS)
require(tree)# arvores de decisao
require(rpart)# arvores de decisao
# Leitura do conjunto de dados
dados<-read.csv2('http://www.leg.ufpr.br/~joel/dados/hiipertensao.csv',na.strings="")
#Descritivo dos dados originais summary(dados) sapply(dados,class) names(dados) #Separação por sexo dad <- split(dados , dados$sexo) dadfem <- dad[["feminino"]] #Eliminação do NA dadf <- na.omit(dadfem) #Verificação summary (dados$sexo) summary (dadfem$sexo) summary (dadf$sexo) sapply(dadf,class) #Verificar os nomes das variáveis names(dadf) #Substituições necessárias devido erro de digitação dadf$tabag[92]<-NA #era 2 dadf$tabag[713]<-NA #era 8 #Eliminação do NA dadff <- na.omit(dadf) #Verificação summary (dados$sexo) summary (dadfem$sexo) summary (dadf$sexo) summary (dadff$sexo) #Arrumando classe de dados dadff$inst <- as.factor(dadff$inst) dadff$tabag <- as.factor(dadff$tabag) dadff$dcv <- as.factor(dadff$dcv) dadff$peso <- as.numeric(dadff$peso) dadff$estat <- as.numeric(dadff$estat) dadff$pasis <- as.numeric(dadff$pasis) dadff$padias <- as.numeric(dadff$padias) dadff$ccint <- as.numeric(dadff$ccint) dadff$cabd <- as.numeric(dadff$cabd) dadff$cquad <- as.numeric(dadff$cquad) dadff$ccoxa <- as.numeric(dadff$ccoxa) dadff$dcabd <- as.numeric(dadff$dcabd) dadff$dcsupra <- as.numeric(dadff$dcsupra) dadff$dctric <- as.numeric(dadff$dctric) dadff$dccoxa <- as.numeric(dadff$dccoxa) dadff$fa30 <- as.numeric(dadff$fa30) dadff$lc30 <- as.numeric(dadff$lc30) dadff$tc6x <- as.numeric(dadff$tc6x) dadff$tc6f <- as.factor(dadff$tc6f) dadff$Idade <- as.numeric(dadff$Idade) dadff$imc <- as.numeric(dadff$imc) dadff$rcq <- as.numeric(dadff$rcq) dadff$nsecon <- as.factor(dadff$nsecon) dadff$exerc <- as.numeric(dadff$exerc) dadff$hipertensao <- as.factor(dadff$hipertensao) dadff$diabete <- as.factor(dadff$diabete) dadff$regi <- as.factor(dadff$regi) dadff$hipaf <- as.factor(dadff$hipaf) dadff$somadc <- as.numeric(dadff$somadc) #Verificação sapply(dadff,class)
# Criacao de vetor de indices
> ind<-1:150
# 90% dos dados
> 0.9*150
[1] 135
# Indices para treinamento
> ind.train<-sample(ind,135)
> ind.train
[1] 77 103 89 57 122 75 41 81 147 94 144 117 128 6 55 7 52 5
[19] 118 96 98 125 104 115 30 80 35 17 20 95 50 27 56 40 9 109
[37] 87 82 100 39 135 142 48 78 63 16 73 120 18 71 137 150 138 85
[55] 13 23 136 12 8 72 61 68 112 93 83 76 140 146 26 43 62 134
[73] 53 65 11 102 79 121 49 141 45 54 47 149 131 99 21 15 110 124
[91] 22 113 74 88 129 42 1 51 10 145 3 86 28 25 29 114 33 37
[109] 58 126 97 46 116 64 111 108 66 34 105 14 60 59 101 92 107 4
[127] 130 119 127 132 91 90 84 133 24
# Selecao do conjunto de treinamento
> iris.train<-iris[ind.train,]
# Selecao do conjunto de teste
> iris.test<-iris[-ind.train,]
# Ajuste da arvore de classificacao
> tr.rp<-rpart(Species~.,data=iris.train)
# Grafico da arvore
> plot(tr.rp);text(tr.rp)
# Armazenando os valores preditos
> preditos<-predict(tr.rp,newdata=iris.test)
> preditos
setosa versicolor virginica
2 1 0.00000000 0.00000000
19 1 0.00000000 0.00000000
31 1 0.00000000 0.00000000
32 1 0.00000000 0.00000000
36 1 0.00000000 0.00000000
38 1 0.00000000 0.00000000
44 1 0.00000000 0.00000000
67 0 0.90196078 0.09803922
69 0 0.90196078 0.09803922
70 0 0.90196078 0.09803922
106 0 0.02439024 0.97560976
123 0 0.02439024 0.97560976
139 0 0.02439024 0.97560976
143 0 0.02439024 0.97560976
148 0 0.02439024 0.97560976
# Conjunto de teste
> iris.test
Sepal.Length Sepal.Width Petal.Length Petal.Width Species
2 4.9 3.0 1.4 0.2 setosa
19 5.7 3.8 1.7 0.3 setosa
31 4.8 3.1 1.6 0.2 setosa
32 5.4 3.4 1.5 0.4 setosa
36 5.0 3.2 1.2 0.2 setosa
38 4.9 3.6 1.4 0.1 setosa
44 5.0 3.5 1.6 0.6 setosa
67 5.6 3.0 4.5 1.5 versicolor
69 6.2 2.2 4.5 1.5 versicolor
70 5.6 2.5 3.9 1.1 versicolor
106 7.6 3.0 6.6 2.1 virginica
123 7.7 2.8 6.7 2.0 virginica
139 6.0 3.0 4.8 1.8 virginica
143 5.8 2.7 5.1 1.9 virginica
148 6.5 3.0 5.2 2.0 virginica
> help(predict)
> help(predict.rpart)
# Classes preditas (type ="class")
> preditos<-predict(tr.rp,newdata=iris.test,type="class")
> preditos
2 19 31 32 36 38 44
setosa setosa setosa setosa setosa setosa setosa
67 69 70 106 123 139 143
versicolor versicolor versicolor virginica virginica virginica virginica
148
virginica
Levels: setosa versicolor virginica
> table(iris.test$Species,preditos)
preditos
setosa versicolor virginica
setosa 7 0 0
versicolor 0 3 0
virginica 0 0 5
<echo=F,results=hide>>= ind<-1:989 # Criacao de vetor de indices ind.trein<-sample(ind,890)# Indices para treinamento ind.trein dados.trein<-dadff[ind.trein,] # Selecao do conjunto de treinamento dados.test<-dadff[-ind.trein,] # Selecao do conjunto de teste @
dadostrein<-read.table("http://www.leg.ufpr.br/~joel/dados/dadostrein.txt",h=T)
dadostest<-read.table("http://www.leg.ufpr.br/~joel/dados/dadostest.txt",h=T)