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)