Beruflich Dokumente
Kultur Dokumente
Prefcio
Esta apostila faz parte do material didtico do curso Introduo ao software S-PLUS, ministrado neste Departamento de Estatstica, sendo formada por notas de aula e exerccios prticos. Essas notas foram basedas nos seguintes manuais do S-PLUS (Version 3.2 Release 1 for Sun SPARC, SunOS 4.x):
Avanado: S-PLUS Users Manual S-PLUS Guide to Statistical and Mathematical Analysis S-PLUS Programmers Manual S-PLUS Reference Manual I e II
Embora estes sejam manuais da verso S-PLUS para UNIX, so poucas as mudanas quando se trabalha na verso para Windows. Outro importante guia para elaborao dessas notas foi o livro Modern Apllied Statistics with SPlus, de Willian N. Venables e Brian D. Ripley (1994, Springer-Verlag New York Inc.). Dentre as diversas tarefas implementadas no S-PLUS, algumas mereceram destaque por terem se mostrado as mais teis ao longo da minha experincia com o software. Como a melhor maneira de se aprender um software us-lo, recomendo que a leitura desta apostila seja feita interativamente com o uso do S-PLUS. O programa possui um Help on Line nos padres dos softwares para Windows e, portanto, fcil de ser usado.
ndice
1- Aspectos Gerais do S-PLUS 2- A organizao de dados no S-PLUS Vetores Matrizes Data Frame Listas Expressando Dados Faltantes no S-PLUS 3- Manipulando dados Extraindo subconjuntos de dados Substuindo subconjuntos de dados Operaes com vetores e matrizes Ordenando os dados Extraindo valores repetidos 4- As funes S-PLUS 5- Distribuies de Probabilidade e Nmeros Aleatrios Funo sample: gerao de amostras aleatrias ou permutao dos dados 6- Algumas funes teis na Anlise Exploratria dos dados Descrevendo, resumindo e transformando numericamente os dados Operaes repetidas: a funo apply 7- Grficos Alguns grficos teis Anlise Exploratria dos dados Funo abline: Adicionando uma linha ao grfico corrente Funes points e lines: Adicionando pontos ou linhas ao grfico corrente Funes segments e arrows: Desenhando segmentos de linha desconectados ou flechas no grfico corrente 8- Escrevendo funes S-PLUS 9- Consideraes finais 10- S-PLUS na Internet 4 6 6 9 11 13 15 16 16 19 19 23 23 25 28 30 32 32 33 37 37 43 46 48 49 56 56
Apndice: Exemplos do contedo do Help on Line Contedo do manual Guide to Statistical and Mathematical Analysis
57
O sinal > o prompt da linha de comando, indicando que o S-PLUS est pronto para comear a receber comandos (nos exemplos e exerccios, o sinal > aparecer antes do comando a ser executado para representar a tela da janela Commands. No digite o prompt ao tentar os exerccios). No S-PLUS, ao contrrio de outros softwares estatsticos para Windows, as tarefas requeridas pelo analista no esto todas comodamente dispostas nos menus ao alcance do mouse. Essas tarefas, como manipular seus dados, fazer determinada anlise estatstica ou desenhar um grfico, devem ser requeridas na linha de comando na janela Commands. Embora em princpio isso possa parecer uma desvantagem, o uso mais avanado do S-PLUS mostrar que essa orientao vantajosa, pois permite imensa flexibilidade de uso e expanso das capacidades do software. O S-PLUS tenta interpretar tudo o que digitado na linha de comando (seguido de ENTER ). Veja estes testes:
> 2 [1] 2 > 2+2 [1] 4 > 2 < 4 [1] T > 2 > 4 [1] F
Interpretou a entrada 2 como o nmero 2 Assumiu a tarefa de calculadora Avaliou a expresso e respondeu que verdadeira (T) Avaliou a expresso e respondeu que falsa (F) Retornou o valor de , que est armazenado internamente
No S-PLUS, os dados so armazenados na forma de objetos. Na prxima seo veremos os tipos de objetos de dados e como eles podem ser criados. Uma vez criado, um objeto S-PLUS armazenado no sub-diretrio _Data do diretrio Home do S-PLUS (voc pode mudar isso). Assim, se a tabela Sexo Idade Altura 1 51 1 .78 1 55 1.75 1 40 1.81 2 48 1.75 2 46 1 .81 2 42 1.70
Copyrigth Edna Afonso Reis
5 j existe no diretrio _Data com o nome de tab1, ao digitar tab1 na linha de comando, o S-PLUS ir mostrar o contedo do objeto tab1:
> tab1 Sexo Idade Altura [1,] 1 51 1.78 [2,] 1 55 1.75 [3,] 1 40 1.81 [4,] 2 48 1.75 [5,] 2 46 1.81 [6,] 2 42 1.70
Um objeto S-PLUS criado como o resultado de um expresso S-PLUS. Para salvar o objeto resultante, simplemente associe um nome ao objeto usando operadores de atribuio <- , _ ou ->. Por exemplo, os comandos seguinte criam um objeto x que contm o inteiro 10:
> x <- 10
ou
> x _ 10
ou
10 -> x
Uma vez criados e associados a nomes (usando o operador de atribuio), os objetos S-PLUS so permanentes, isto , escritos no disco sem que voc precise salv-los ao sair do programa. O contedo do diretrio pode ser visto atravs do comando ls() ou usando o Object Manager do menu Tolls. Pode-se remover um objeto do diretrio atravs do comando rm(nome dos objetos separados por vrgula):
> rm(x)
No S-PLUS existe distino entre letras maisculas e minsculas, para os nomes de objetos ou de suas funes (comandos). Assim, o objeto tab1 diferente do objetos Tab1, TAB1 ou taB1 e a funo rm no ser reconhecida se voc digitar RM.
> RM(x) Error: couldn't find function "RM"
Conjunto de elementos de mesmo modo em uma ordem especificada (unidimensional) Disposio bidimensional de elementos de mesmo modo Disposio bidimensional cujas colunas que podem representar dados de modos diferentes Conjunto de componentes que podem ser de qualquer um dos outros tipos de objetos
list
Modo binrio, com valores representados as T ou F (true ou false) Nmeros reais Nmeros complexos (parte real e imaginria) Caracteres representados como strings
A seguir, veremos mais detalhes de cada um dos tipos de dados e como cri-los no S-PLUS.
Vetores
Um vetor um conjunto de elementos em uma ordem especfica. A ordem especificada quando voc cria o vetor (usualmente a ordem na qual voc digita os dados) e isto importante porque voc pode se referir a um elemento unicamente pela sua posio no vetor. Todos os elementos de um vetor devem ser de um nico modo. Como os dados so mais frequentemente nmeros, os vetores nmericos so os mais usuais. Por exemplo, suponha que voc tenha medido o volume de gasolina (em litros) que voc adicionou a seu carro em 118 paradas para completar o tanque. Suponha tambm que esses dados esto em um arquivo texto chamado carro.txt (no diretrio Home do S-PLUS), com o seguinte contedo:
Copyrigth Edna Afonso Reis
7 13.3 12.2 11.5 13.5 14.3 25.7 13.3 12.7 8.9 14.2 12 13.2 12.8 13.6 12.3 13.2 13.1 13.6 13.6 13 12.5 11.6 7.5 14.2 11.9 13.1 13.6 14.2 12.1 12.8 13.9 13 12.5 13.6 12.8 14.2 13 13.8 12.3 8.9 10.3 11.6 7.8 14.5 7.1 12 12.3 12.5 14.1 13 12.3 13.2 13.7 13.4 12.5 12.9 13.3 6.2 13.2 12.8 11.2 13.5 13.2 14.1 13.6 13 12.8 13.2 12.9 13 13 12 14.5 21.2 13.2 12.9 12.5 22 13.1 12.3 13.2 13.7 12.5 13.2 13.5 13.9 12.5 12.4 12.3 10.5 11.5 12.8 12 13 5.8 9.5 9 7.7 10.1 11.9 11.4 12.6 12.5 12.7 13.6 11.7 13.5 12.3 13 13.2 13.2 11.6 13.8 13.5 13.9 14.2 13 13
Voc pode criar o vetor numrico carro.gas com esses dados da seguinte maneira:
> carro.gas <- scan(file = "carro.txt")
Ou seja, estamos atribuindo (smbolo <- ) ao vetor carro.gas o resultado da leitura de dados nmericos que esto no arquivo carro.txt, atravs da funo scan. Digitando carro.gas na linha de comando, vemos que o vetor foi criado:
> carro.gas [1] 13.3 12.2 [16] 13.2 13.1 [31] 13.9 13.0 [46] 12.0 12.3 [61] 11.2 13.5 [76] 12.9 12.5 [91] 11.5 12.8 [106]11.7 13.5 11.5 13.6 12.5 12.5 13.2 22.0 12.0 12.3 13.5 13.6 13.6 14.1 14.1 13.1 13.0 13.0 14.3 13.0 12.8 13.0 13.6 12.3 5.8 13.2 25.7 12.5 14.2 12.3 13.0 13.2 9.5 13.2 13.3 12.7 8.9 14.2 12.0 13.2 12.8 13.6 12.3 11.6 7.5 14.2 11.9 13.1 13.6 14.2 12.1 12.8 13.0 13.8 12.3 8.9 10.3 11.6 7.8 14.5 7.1 13.2 13.7 13.4 12.5 12.9 13.3 6.2 13.2 12.8 12.8 13.2 12.9 13.0 13.0 12.0 14.5 21.2 13.2 13.7 12.5 13.2 13.5 13.9 12.5 12.4 12.3 10.5 9.0 7.7 10.1 11.9 11.4 12.6 12.5 12.7 13.6 11.6 13.8 13.5 13.9 14.2 13.0 13.0
Quando mostra um vetor, o S-PLUS comea cada linha com o ndice do primeiro elemento da linha entre colchetes []. O ndice indica a posio do elemento dentro do vetor. Voc pode usar o ndice do elemento para se referir a ele, como por exemplo, para pedir que somente o sexto elemento seja mostrado:
> carro.gas[6] [1] 25.7
Observao: No exemplo acima, o resultado da expresso carro.gas[6] comea com o ndice 1, embora ns pedimos pelo elemento com ndice 6. A incinsitncia apenas aparente, entretanto; porque, sendo carro.gas[6] uma expresso S-PLUS, o resultado de sua avaliao um objeto S-PLUS, neste caso um vetor com apenas um elemento. Assim, em carro.gas, a observao 25.7 o sexto elemento, mas em carro.gas[6] a observao 25.7 passou a ser o primeiro (e nico) elemento.
Podemos usar a funo scan para criar um vetor digitando os dados dentro do S-PLUS. Por exemplo, voc poderia criar um pequeno vetor com as notas de cinco alunos em uma prova da seguinte maneira:
> notas <- scan()
8 Aps o ENTER , o S-PLUS retorna o sinal de prompt 1: para indicar que ele est pronto para receber o primeiro elemento do vetor (e os prximos tambm):
> notas <- scan() 1:
Digite as notas:
> notas <- scan() 1: 95 90 98 4: 99 87
O prompt > aparece para indicar que o S-PLUS terminou a leitura do vetor notas. O contedo do objeto notas :
> notas [1] 95 90 98 99 87
Voc pode criar um vetor de caracteres (como nomes) usando a funo scan com o argumento what=character(n), onde n o nmero de nomes que voc gostaria de ler:
> alunos <- scan(what=character(5)) 1: Ariadne Joel Alana Agnes Juan 6: > alunos [1] "Ariadne" "Joel" "Alana" "Agnes"
"Juan"
Podemos dar nomes aos elementos de um vetor atravs da associao desse vetor a um outro vetor de nomes com o mesmo length que ele. Isso feito usando-se a funo names:
> names(notas) <- alunos > notas Ariadne Joel Alana Agnes Juan 95 90 98 99 87
9 Um modo mais fcil (de ser lembrado) de criar um vetor de caracteres usando a funo c:com os caracteres (nomes) entre aspas duplas:
> alunos <- c("Ariadne","Joel","Alana","Agnes","Juan") > alunos [1] "Ariadne" "Joel" "Alana" "Agnes" "Juan"
Outro tipo de dados no-numricos so os dados categricos, que so obervaes vindas de um nmero finito de categorias. Os dados categricos so representados no S-PLUS por meio de fatores. Por exemplo, voc pode criar um fator com o sexo dos alunos do exemplo anterior, atravs da funo factor (veja outros exemplos interessantes do uso dessa funo no Help):
> sexo <- factor(scan(what="")) 1: Fem Masc Fem Fem Masc 6: >
ou
> sexo <- factor(c("Fem","Masc","Fem","Fem","Masc"))
A Tabela 1 resume algumas funes teis para criar vetores. Em particular, a funo : , que define uma seqncia numrica,
> 1:10 [1] 1 2 3 4 5 6 7 8 9 10
til na extrao de subconjuntos de dados. Por exemplo, se desejamos visualizar apenas os dez primeiros ou os cinco ltimos elementos do vetor carro.gas, fazemos:
> carro.gas[1:10] [1] 13.3 12.2 11.5 13.5 14.3 25.7 13.3 12.7 > carro.gas[114:118] [1] 13.5 13.9 14.2 13.0 13.0 8.9 14.2
Matrizes
Uma matriz uma disposio bidimensional dos dados, em linhas e colunas. a maneira usual de se enxergar os dados: as colunas so as variveis e as linhas so os indivduos. Os elementos de uma matriz no S-PLUS devem ser de um nico modo, sendo mais comum termos dados numricos. Por exemplo, suponha que voc tenha o conjunto de notas de cinco alunos em trs provas armazenado em um arquivo texto chamado notas.txt (no diretrio Home do SPLUS), com o seguinte contedo:
10 95 90 98 99 87 94 89 95 97 86 96 90 99 100 88
onde as linhas representam os alunos e as colunas representam as provas. Podemos usar a funo matrix para converter um vetor em uma matriz, especificando o nmero de linhas (ou colunas) e se o preenchimento da matriz deve ser feito por colunas (default) ou por linhas. A funo matrix tem a seguinte estrutura:
matrix(dados, nrow= , ncol= , byrow=F)
onde o argumento byrow tem valor lgico, com F (false) para prenchimento por colunas e T (true) para preenchimento por linhas. Para ler matrizes em dados externos como notas.txt, a funo matrix deve ser usada em conjunto com a funo scan:
> notas.mat <- matrix(scan("notas.txt"), ncol=3, byrow=T) > notas.mat [,1] [,2] [,3] [1,] 95 94 96 [2,] 90 89 90 [3,] 98 95 99 [4,] 99 97 100 [5,] 87 86 88
Note que o preenchimento da matriz foi feito por linhas, ou seja, byrow=T. Assim como os vetores, uma matriz pode ser criada digitando-se seus valores diretamente no S-PLUS, atravs da funo scan sem argumentos:
> notas.mat <- matrix(scan(), ncol=3, byrow=T) 1: 95 94 96 90 89 90 98 95 99 99 97 100 87 86 88 16: >
Uma matriz tambm pode ser construda pela combinao de dois ou mais vetores de mesmo length. Por exemplo, se temos trs vetores com as notas em cada prova,
> notas.p1 <- c(95,90,98,99,87) > notas.p2 <- c(94,89,95,97,86) > notas.p3 <- c(96,90,99,100,88)
Cada elemento de uma matriz unicamente identificado pela sua posio na matriz, ou seja, indicando-se a linha e a coluna onde o elemento est. Assim, a nota do quarto aluno (linha) na terceira prova (coluna) identificada por:
> notas.mat[4,3] [1] 100
O nmero de linhas e o nmero de colunas de uma matriz a sua dimenso, que pode ser obtida usando-se a funo dim :
> dim(notas.mat) [1] 5 3
A Tabela 2 resume algumas funes teis para criar e manipular matrizes. Podemos associar nomes s linhas e colunas de uma matriz usando a funo dimnames , que retorna uma lista com dois componentes: os nomes das linhas e os nomes das colunas (veja seo Listas).
Data Frame
Freqentemente, os dados so uma mistura de variveis nmericas (como idade), variveis categricas (como sexo) e caracteres (como nome do indivduo). Uma tabela deste tipo no pode ser lida como uma matriz, j que mistura dados de diferentes modos, mas pode ser lida como um data frame (o termo no foi traduzido para clareza do significado). Um data frame tambm uma disposio bidimensional dos dados, mas pode ter elementos de diferentes modos em diferentes colunas, desde que cada coluna tenha o mesmo tamanho. Assim, um data frame uma estrutura tabular na qual as colunas representam variveis e as linhas representam os indivduos. Um data frame pode ser criado de duas maneiras:
read.table data.frame
Assim, suponha que voc tenha em um arquivo texto chamado notasf.txt (no diretrio Home do S-PLUS), que, alm do conjunto de notas de cinco alunos em trs provas, tambm tenha duas colunas com o nome e o sexo dos alunos, com o seguinte contedo:
12 Alunos Ariadne Joel Alana Agnes Juan Sexo Fem Masc Fem Fem Masc Prova1 95 90 98 99 87 Prova2 94 89 95 97 86 Prova3 96 90 99 100 88
Para ler essa tabela como data frame do S-PLUS, vamos utilizar a funo read.table:
> notas.frame <- read.table("notasf.txt", header=T) > notas.frame Sexo Prova1 Prova2 Prova3 Ariadne Fem 95 94 96 Joel Masc 90 89 90 Alana Fem 98 95 99 Agnes Fem 99 97 100 Juan Masc 87 86 88
O argumento header=T indica que a primeira linha contm os nomes das colunas. Se no for o caso, apenas no fornea argumento header, pois seu default FALSE.
O nmero de linhas e o nmero de colunas de um data frame podem ser obtidos usando-se a funo dim:
> dim(notas.frame) [1] 5 4
Observao: Note que o S-PLUS tomou a primeira coluna de caracteres da tabela (Alunos) como nomes para as linhas.
Assim como nas matrizes, os elementos de um data frame so indexados pelo nmero da linha e da coluna onde se encontra:
> notas.frame[4,3] [1] 97
Um data frame tambm pode ser criado dentro do S-PLUS atravs da combinao de vrios objetos, como vetores de mesmo length e matrizes com mesmo nmero de linhas:
> notas.frame <- data.frame(sexo,notas.mat) > notas.frame sexo Prova1 Prova2 Prova3 Ariadne Fem 95 94 96 Joel Masc 90 89 90 Alana Fem 98 95 99 Agnes Fem 99 97 100 Juan Masc 87 86 88
13 Por default, data.frame converte todos os vetores de caracteres em fatores. Para preserv-los como dados de caracteres, voc deve usar a funo I ao pass-los para data frame:
> lixo <- data.frame(A=1:4, B=c("a","b","c","d")) > is.factor(lixo[,2]) [1] T > lixo <- data.frame(A=1:4, B=I(c("a","b","c","d"))) > is.factor(lixo[,2]) [1] F
Observao: a funo is.factor(x) testa se o argumento x do tipo fator. O S-PLUS tem as funes is.numeric, is.vector, is.matrix, etc, para testar se o argumento do modo numrico, do tipo vetor ou matriz, respectivamente.
Listas
A lista o mais flexvel tipo de objeto no S-PLUS, pois os componentes de uma lista podem ser de qualquer modo ou tipo, incluindo outras listas. Voc pode combinar em uma lista, por exemplo, um vetor numrico com 10 valores e uma matriz 5x5 de valores lgicos. A lista a mais freqente escolha para retornar valores nas anlises do S-PLUS. Por exemplo, a sada do ajuste de uma regresso linear retorna em uma lista valores nmericos como os coeficientes e os resduos, que tm comprimentos diferentes, um valor lgico que indica se o intercepto foi ou no ajustado, dentre outros resultados. Uma lista criada atravs da funo list, com os componentes separados po vrgula:
list(componente1, componente2, ...., componenteN)
Como foi mencionado na seo Matrizes, o nome das dimenses de um matriz uma lista com dois componentes: um com os nomes das linhas e o outro com os nomes das colunas. Vamos voltar ao exemplo da matriz notas.mat, com as notas de cinco alunos (linhas) em trs provas (colunas). Vamos recriar a matriz:
> notas.mat <-matrix(c(95,94,96,90,89,90,98,95,99,99,97,100,87,86,88), ncol=3, byrow=T) > notas.mat [,1] [,2] [,3] [1,] 95 94 96 [2,] 90 89 90 [3,] 98 95 99 [4,] 99 97 100 [5,] 87 86 88
Vamos criar uma lista com os nomes dos cinco alunos em um componente e os nomes das trs colunas (provas) em outro componente:
Copyrigth Edna Afonso Reis
14
> notas.list <- list(alunos, c("Prova1", "Prova2", "Prova3"))
"Alana"
"Agnes"
"Juan"
O nmero de componentes de uma lista pode ser obtido atravs da funo length:
> length(dimnames(notas.mat)) [1] 2
Os componentes de uma lista so identificados pela sua posio na lista, entre duplo colchetes
[[#]]:
> dimnames(notas.mat)[[1]] [1] "Ariadne" "Joel" "Alana" > dimnames(notas.mat)[[2]] [1] "Prova1" "Prova2" "Prova3" "Agnes" "Juan"
Os nomes dos componentes podem ser dados durante a criao da lista ou atravs da funo names:
> dimnames(notas.mat)<-list(Alunos=alunos,Provas=c("Prova1","Prova2", "Prova3"))
ou
> names(dimnames(notas.mat)) <- c("Alunos", "Provas") > dimnames(notas.mat) $Alunos: [1] "Ariadne" "Joel"
"Alana"
"Agnes"
"Juan"
"Agnes"
"Juan"
15 Tabela 1: Funes teis para criar vetores Descrio Exemplos scan(),scan(what=character(10)) L valores de qualquer modo Combina valores de qualquer modo Repete valores de qualquer modo Cria seqncias no modo numeric Cria seqncias no modo numeric Inicializa um vetor Inicializa um vetor no modo logical Inicializa um vetor no modo numeric Inicializa um vetor no modo complex Inicializa um vetor no modo character
scan(dados) c(1,2,3), c(yes,no) c(vetor1, vetor2, vetor3) rep(NA,5), rep(c(10,20),10) rep(c(1,2),c(10,20)) seq(-pi,pi,length=100) seq(0,1, by=0.01) 0:5, 1:-1, 10*(1:10), 0.5:3.5 vector(complex,3) logical(3) numeric(4) complex(5) character(6)
Funo
scan c rep seq : vector logical numeric complex caracter
Funo
matrix cbind rbind diag t solve data.matrix
Tabela 2: Funes teis para criar matrizes Descrio Exemplos matrix(1,20,10) Cria uma matriz Combina colunas de matrizes Combina linhas de matrizes Retorna a diagonal de uma matriz; Cria uma matriz diagonal Retorna a matriz transposta Retorna a matriz inversa Converte data frame para matriz
matrix(1:12, ncol=4, byrow=T) cbind(21:30,rep(1,10)), cbind(matriz1,matriz2,matriz3) rbind(21:30,rep(1,10)), rbind(matriz5,matriz6) diag(matrix(1:16,4,4,T)) diag(mat) <- 1 mat <- diag(25,10) t(mat) solve(mat) data.matrix(dados.frame)
Para saber se um objeto tem valores NA, fazemos o teste com a funo is.na, que retorna T para os elementos NA e F, caso contrrio:
> is.na(notas2) [1] F F T F F
Algumas funes S-PLUS permitem que os dados tenham valores NA (veja a funo abs no Help). Dentre as funes que no aceitam valores NA, algumas tm a opo de automaticamente remov-los (veja a funo mean), enquanto outras s funcionam se voc remover os valores NA antes de chamar a funo (veja a funo var).
Copyrigth Edna Afonso Reis
16
3- Manipulando dados
Nesta seo apresento algumas formas de extrair e modificar subconjuntos de dados no S-PLUS usando a idia de se referir a elemento do objeto de dados pela sua posio nele. Trs tarefas especiais de manipulao de dados so destacadas nessa seo: fazer operaes aritmticas com os dados, orden-los e extrair valores repetidos.
Matrizes e Vetores Seja a matriz notas.mat anterior, com as notas de cinco alunos (linhas) em trs provas (colunas):
> notas.mat Prova1 Prova2 Prova3 Ariadne 95 94 96 Joel 90 89 90 Alana 98 95 99 Agnes 99 97 100 Juan 87 86 88
Sabemos que podemos extrair um determinado elemento da matriz indicando sua posio [linha,coluna] na matriz. Por exemplo, a nota da aluna Agnes (linha 4) na segunda prova (coluna 2) pode ser obtida inicando a posio [4,2]:
> notas.mat[4,2] [1] 97
Para extrair uma linha inteira, basta fornecer o nmero (nome) da linha e deixar em branco o nmero da coluna. Assim, para obter as notas da aluna Agnes em todas as provas:
> notas.mat[4,] Prova1 Prova2 Prova3 99 97 100
ou
> notas.mat["Agnes",] Prova1 Prova2 Prova3 99 97 100
Da mesma forma, para obter as notas de todos os alunos apenas na segunda prova (coluna 2):
> notas.mat[,2] Ariadne Joel Alana Agnes Juan 94 89 95 97 86
ou
> notas.mat[, "Prova2"] Ariadne Joel Alana Agnes Juan 94 89 95 97 86
Copyrigth Edna Afonso Reis
17 Voc pode combinar ndices de linhas ou colunas em vetores e usar esses vetores dentro do operador [,]. Por exemplo, para saber apenas as notas dos alunos do sexo masculino nas duas primeiras provas, fazemos:
> notas.mat[c(2,5), 1:2] Prova1 Prova2 Joel 90 89 Juan 87 86
Muitas vezes queremos montar uma matriz como um subconjunto de linhas (ou colunas) de outra matriz, mas o nmero de linhas que sero mantidas maior que nmero de colunas que sero eliminadas. Por exemplo, para montar um matriz formada pelas linhas 1, 3 e 5 da matriz notas.mat, podemos manter essas linhas
> notas2.mat <- notas.mat[c(1,3,5),] > notas2.mat Prova1 Prova2 Prova3 Ariadne 95 94 96 Alana 98 95 99 Juan 88 85 88
ou eliminar as linhas 2 e 4, usando o operador - antes do vetor que define os ndices das linhas a serem elimindas:
> notas2.mat <- notas.mat[-c(2,4),] > notas2.mat Prova1 Prova2 Prova3 Ariadne 95 94 96 Alana 98 95 99 Juan 88 85 88
Voc pode tambm extrair um subconjunto de linhas (ou colunas) que obedecem uma determinada condio. Por exemplo, suponha que queremos retirar da matriz notas.mat apenas as notas na segunda prova que sejam maiores ou iguais a 90. Vamos fazer isso passo a passo: primeiro vamos criar um vetor com a notas da segunda prova, ou seja, com a coluna 2 da matriz notas.mat:
> p2 <- notas.mat[,2] > p2 Ariadne Joel Alana Agnes Juan 94 89 95 97 86
Assim, estamos procurando pelos elementos das posies 1, 3 e 4 do vetor p2 (equivalentemente, pelos elementos das posies [1,2], [3,2] e [4,2] da matriz notas.mat). O vetor lgico que o SPLUS retorna pode ser armazenado em um objeto:
> aux <- p2 >= 90 > aux Ariadne Joel Alana Agnes Juan T F T T F
Copyrigth Edna Afonso Reis
18 Finalmente vamos indicar para o S-PLUS que ele deve extrair do vetor p2 apenas os elementos com valor T no vetor aux, pois estes so os elementos que obedecem condio imposta sobre as notas as segunda prova:
> p2.cA <- p2[aux] > p2.cA Ariadne Alana Agnes 94 95 97
Quando voc estiver mais familiarizado com expresses encaixadas, voc poder omitir os passos intermedirios e obter o resultado desejado com apenas uma expresso:
> notas.mat[notas.mat[,2]>=90,2] Ariadne Alana Agnes 94 95 97
Esta expresso est dizendo ao S-PLUS para selecionar da matriz notas.mat os elementos (linhas) da segunda coluna sob a condio de que os elementos da segunda coluna da matriz notas.mat sejam maiores ou iguais a 90. Usando a mesma idia, podemos, em apenas uma expresso, selecionar as notas da primeira prova dos alunos que tiraram nota menor que 90 na segunda prova:
> notas.mat[notas.mat[,2]<90,1] Joel Juan 90 87
Listas Vimos anteriormente que podemos extrair os componentes de uma lista usando o operador duplo colchete [[]] ou, se os componentes forem nomedos, atravs do operador $:
> list1 <- list(codigo=letters[1:5], nota=notas.mat) > list1 $codigo: [1] "a" "b" "c" "d" "e" $nota: Ariadne Joel Alana Agnes Juan Prova1 Prova2 Prova3 95 94 96 90 89 90 98 95 99 99 97 100 87 86 88
> list1[[1]] [1] "a" "b" "c" "d" "e" > list1$nota Prova1 Prova2 Prova3 Ariadne 95 94 96 Joel 90 89 90 Alana 98 95 99 Agnes 99 97 100 Juan 87 86 88
19 Uma vez que voc extraiu um componente da lista, voc pode usar a forma apropriada de extrair subconjuntos para aquele tipo de objeto. Por exemplo, para extrair a quarta linha da matriz que o segundo componente da lista list1, podemos seguir esses passos:
> mat.list1 <- list1[[2]] > mat.list1[4,] Prova1 Prova2 Prova3 99 97 100
Alm de serem teis na extrao de subconjuntos de dados, os operadores de susbscrito ([] e [[]]) so usados tambm para substituir valores no conjunto de dados por novos valores, apenas informando a posio do elemento que receber o novo valor. Por exemplo, a nota do quarto aluno na segunda prova pode ser substituda na matriz notas.mat pelo novo valor 100 da seguinte forma:
> notas.mat[4,2] <- 100 > notas.mat Prova1 Prova2 Prova3 Ariadne 95 94 96 Joel 90 89 90 Alana 98 95 99 Agnes 99 100 100 Juan 87 86 88
Voc pode substituir mais de um valor ao mesmo tempo. Por exemplo, para substituir as notas do quarto e do quinto aluno na primeira e segunda prova, fazemos:
> notas.mat[4:5,1:2] <- c(100,88,99,85) > notas.mat Prova1 Prova2 Prova3 Ariadne 95 94 96 Joel 90 89 90 Alana 98 95 99 Agnes 100 99 100 Juan 88 85 88
A maioria dos dados que analisamos so numricos e dados numricos so freqentemente manipulados usando funes e operadores matemticos. A Tabela 3 mostra os operadores matemticos no S-PLUS (e alguns operadores lgicos e de comparao) e na seo 8 veremos algumas funes matemticas. Operaes matemticas no S-PLUS so vetorizadas, significando que elas atuam no objeto de dados inteiro de uma s vez, elemento por elemento.
Copyrigth Edna Afonso Reis
20 Tabela 3: Operaes no S-PLUS Operadores Aritmticos adio subtrao produto diviso exponenciao resto da diviso inteiro da diviso multiplicao matricial Operadores de Comparao igual a no igual a menor que maior que menor ou igual a maior ou igual a Operadores Lgicos no ou ou sequencial (para avaliar condies) e e sequencial (para avaliar condies)
Para ilustrar o uso dos operadores matemticos, suponha que temos dois vetores x e y:
> x <- c(2,3,5,8,6,4) > y <- c(5,7,9,1,3,6)
Para somar, subtrair, multiplicar e dividir os dois vetores, elemento por elemento, faa:
> x + y [1] 7 10 14 > x - y [1] -3 -4 -4 > x*y [1] 10 21 45 9 7 9 10 3 -2
8 18 24
Voc pode multiplicar todos os elementos do vetor por 10, por exemplo:
> 10*x [1] 20 30 50 80 60 40
21 Com as matrizes, os operadores funcionam igualmente, aplicando a operao elemento por elemento da matriz. Sejam as matrizes M, Mt (transposta de M) e V:
> M <- matrix(1:12,3,4) > Mt <- t(M) > V <- matrix(13:24,4,3) > M [1,] [2,] [3,] > Mt [1,] [2,] [3,] [4,] > V [1,] [2,] [3,] [4,] [,1] [,2] [,3] 13 17 21 14 18 22 15 19 23 16 20 24 [,1] [,2] [,3] 1 2 3 4 5 6 7 8 9 10 11 12 [,1] [,2] [,3] [,4] 1 4 7 10 2 5 8 11 3 6 9 12
Como tm a mesma dimenso, as matrizes Mt e V podem ser somadas ou multiplicadas elemento por elemento:
> Mt + V [,1] [,2] [,3] [1,] 14 19 24 [2,] 18 23 28 [3,] 22 27 32 [4,] 26 31 36 > Mt*V [,1] [,2] [,3] [1,] 13 34 63 [2,] 56 90 132 [3,] 105 152 207 [4,] 160 220 288
Mas note que a multiplicao matricial de M por V feita usando-se o operador %*%:
> M%*%V [,1] [,2] [,3] [1,] 334 422 [2,] 392 496 [3,] 450 570
Voc pode ter expresses mais complexas no S-PLUS, envolvendo quantos objetos voc queira (desde que compatveis):
> (c(2*(1:5), x)/4)^5 [1] 0.0312500 1.0000000 7.5937500 32.0000000 97.6562500 [7] 0.2373047 3.0517578 32.0000000 7.5937500 1.0000000 0.0312500
22 A montagem das expresses no S-PLUS segue a mesma lgica que voc usaria se estivesse escrevendo a expresso no papel, inclusive obedecendo a hierarquia das operaes matemticas. Por exemplo, o operador * (multiplicao) tem prioridade sobre o operador + (soma). Se voc desejar que a soma seja feita antes da multiplicao, voc deve usar a expresso de soma entre parnteses:
> (2+4)*2 [1] 12
que diferente de
> 2+4*2 [1] 10
Os operadores de comparao tambm operam em cada elemento do vetor ou matriz, retornando um objeto com valores lgicos (T ou F) do mesmo tipo e dimenso do objeto avaliado:
> notas.mat == 100 Prova1 Prova2 Prova3 Ariadne F F F Joel F F F Alana F F F Agnes T F T Juan F F F
Os operadores lgicos so utilizados para combinar expresses que retornem valores lgicos, como aquelas formadas por operadores de comparao, e a expresso final retorna um valor lgico:
> (3>2) & (pi < 4) [1] T > (3>2) | (pi < 4) [1] T > (1>2) & (4 != 2+2) [1] F > (1>2) | (4 != 2+2) [1] F > (3>2) & (1>2) [1] F > (3>2) | (1>2) [1] T
verdadeiro
OU verdadeiro E falso
OU falso E falso
OU falso
23 Ordenando os dados
ordena os valores de um vetor coloca os valores de um vetor na ordem inversa retorna um vetor de inteiros contendo a permutao que ir ordenar o objeto de entrada em ordem crescente retorna os postos dos valores de um vetor
Exemplos:
> rank(c(2,4,5,1,7,6)) [1] 2 3 4 1 6 5 > rank(c(2,2,5,1,7,6)) [1] 2.5 2.5 4.0 1.0 6.0 5.0 > sort(c(2,4,5,1,7,6)) [1] 1 2 4 5 6 7 > rev(c(2,4,5,1,7,6)) [1] 6 7 1 5 4 2 > order(c(12,14,15,11,17,16)) [1] 4 1 2 3 6 5
Obs: O resultado dessa aplicao da funo order indica que, para que o vetor dado seja ordenado em ordem crescente, devemos dispor inicialmente o quarto elemento (11), depois o primeiro elemento (12), ..., e finalmente o quinto elemento (17).
unique duplicated
retorna os valores de um vetor sem qualquer repetio de valores retorna um vetor lgico indicando quais elementos so duplicatas de elementos anteriores
Exemplos:
24
Exerccios:
1) Seja a seguinte matriz de dados:
> mat <- matrix(c(1,3,2,2,5,4,6,5,6,9,7,8,10,12,11,11,12,14,14,16),ncol=5) > mat [,1] [,2] [,3] [,4] [,5] [1,] 1 5 6 10 12 [2,] 3 4 9 12 14 [3,] 2 6 7 11 14 [4,] 2 5 8 11 16
Crie um nova matriz, mat1, que a matriz mat com linhas ordenadas pela coluna 1:
> mat1 <- mat[order(mat[,1]),] > mat1 [,1] [,2] [,3] [,4] [,5] [1,] 1 5 6 10 12 [2,] 2 6 7 11 14 [3,] 2 5 8 11 16 [4,] 3 4 9 12 14
Crie um nova matriz, mat2, que a matriz mat com linhas ordenadas pelas coluna 1 e, no caso de empate, pela coluna 2:
> mat2 <- mat[order(mat[,1],mat[,2]),] > mat2 [,1] [,2] [,3] [,4] [,5] [1,] 1 5 6 10 12 [2,] 2 5 8 11 16 [3,] 2 6 7 11 14 [4,] 3 4 9 12 14
3) Seja o vetor x criado a seguir. Crie dois novos vetores: um vetor com os valores ordenados e no repetidos de x e outro vetor com os valores de x que aparecem pelo menos duas vezes em x.
> x <- rep(c(4,2,8,10,6), c(1,2,2,1,3)) > x [1] 4 2 2 8 8 10 6 6 6 > y <- sort(unique(x)) > y [1] 2 4 6 8 10 > z <- unique(x[duplicated(x)]) > z [1] 2 8 6
25
4- As funes S-PLUS
Todos os comandos que vimos anteriormente, como ls, scan, c, matrix, sort, so as funes S-PLUS. Uma funo uma expresso S-PLUS que retorna um valor, usualmente depois de realizar alguma operao em ou mais argumentos. Por exemplo, a funo c retorna um vetor formado pela combinao dos argumentos para c. As funes tm a seguinte estrutura:
Nome da funo
Argumentos da funo
nome(arg1,arg2,arg3,...,argN)
Assim, voc pode chamar uma funo digitando, na linha de comando, a expresso consistindo do nome da funo seguido, entre parnteses, pelos argumentos separados por vrgulas. Alguns argumentos da funo possuem um valor default e, a no ser que voc queira mudar esse valor, no precisam ser especificados quando a funo for chamada.
Exemplo:
Veja a funo S-PLUS que realiza o teste F de comparao das varincias de duas amostras independentes vindas de populaes normais.
Nome da funo
Argumentos da funo
valor default
valor default
x,y
vetores que contm as amostras a serem comparadas. Os vetores no precisam ter os nomes x e y ao serem chamados na funo; estes so apenas os nomes que eles tero durante a execuo da funo.
Se voc quiser fazer o teste bilateral e o um intervalo com nvel de confiana de 95%, ento basta fornecer as amostras sample1 e sample2:
var.test(sample1, sample2)
Se voc quiser fazer o teste bilateral mas um intervalo com nvel de confiana de 90%, ento, alm de fornecer as amostras x e y, voc deve modificar o valor do argumento conf.level:
var.test(sample1, sample2, conf.level=.9)
26 Nesta funo, as opes para o argumento alternative so: two.sided: as varincias da populaes de x e y so diferentes, greater: a varincia da populao de x maior que a varincia da populao de y e less: a varincia da populao de x maior que a varincai da populao de y.
Se voc quiser fazer um teste unilateral (maior que) com um intervalo de 90% de confiana, o comando ser:
var.test(sample1, sample2, alternative=greater, conf.level=.9)
ou
var.test(sample1, sample2, greater, .9)
O ltimo comando ser aceito porque o argumentos alternative e conf.level esto em ordem, embora seus nomes no apaream explicitamente. Note que o comando a seguir resutar em uma mensagem de erro:
var.test(sample1, sample2, .9, "greater")
Mensagem de erro: Error in var.test(sample1, sample2, 0.9, "greater"): argument 'alternative' must match one of "greater", "less", "two.sided". Dumped
Mas a mesma tarefa pode ser realizada atravs do comando onde, embora fora de ordem, os argumentos alternative e conf.level so referidos atravs de seus nomes:
O resultado de uma funo S-PLUS pode ser nmerico, lgico, complexo ou caracter, na forma de um dos tipos de objetos S-PLUS, como vetor, matriz, lista, etc. Assim, voc poder armazenar resultado da funo em um objeto.
Exemplo:
27 Podemos atribuir o resultado da funo a um objeto S-PLUS, neste caso uma lista:
> vtest1 <- var.test(amostra1,amostra2) > vtest1
F test for variance equality data: amostra1 and amostra2 F = 1.8943, num df = 6, denom df = 6, p-value = 0.4565 alternative hypothesis: true ratio of variances is not equal to 1 95 percent confidence interval: 0.3254957 11.0243991 sample estimates: variance of x variance of y 33.48952 17.67905
Uma funo pode ser chamada dentro de outra funo para combinar tarefas, como no exerccio 2 da seo 3, onde usamos a funo sort dentro da funo rev. Podemos tambm criar nossas prprias funes no S-PLUS, como veremos na seo 8 . Quando voc digita apenas o nome da funo na linha de comando, o texto da funo mostrado. Por exemplo, a funo rev tem o seguinte texto:
> rev function(x) if(length(x)) x[length(x):1] else x >
Copyrigth Edna Afonso Reis
28
Tabela 4: Funes S-PLUS para gerao de nmeros aleatrios e clculos de probabilidade Letras Operao Argumentos necessrios r Gera nmeros aleatrios Tamanho da amostra, parmetros da distribuio p Calcula probabilidades da f.d.a. Vetor de quantiles, parmetros da distribuio q Calcula quantiles da inversa da f.d.a. Vetor de probabilidades, parmetros da distribuio d Calcula valores da densidade Vetor de quantiles, parmetros da distribuio Tabela 5: Distribuies de probabilidade em S-PLUS Distribuio Argumentos Argumentos Necessrios Opcionais shape1, shape2 Beta size, prob Binomial location, scale Cauchy df Qui-quadrado Exponencial df1, df2 rate F shape Gama prob Geomtrica m, n, k Hipergeomtrica meanlog, sdlog Log-normal location, scale Logstica size, prob Binomial Negativa mean, sd Normal lambda Poisson index skewness Stable df t de Student min, max Uniforme shape scale Weibull m, n Soma dos postos de Wilcoxon
nome
beta binom cauchy chisq exp f gamma geom hyper lnorm logis nbinom norm pois stab t unif weibull wilcox
Default s
0, 1
0, 1 0, 1 0, 1 --, 0 0, 1 --, 1
A funo ppoints(n) cria um vetor de n valores uniformente espaados entre 0 e 1 (probabilidades), sendo til para construir grficos das distribuies (Veja exemplo da seo Grficos - Funes points e lines).
29
Exerccios:
1) Gere 10 valores de uma Normal(mdia=25, desvio padro=5)
> rnorm(10,25,5) [1] 27.64515 20.76271 25.23715 30.93648 30.88803 [6] 28.91334 14.59414 23.49508 16.16100 26.15538
b) Calcule a P(Z>1.96)
> 1- pnorm(1.96,0,1) [1] 0.0249979
30
Funo sample:
A funo sample usada para: Tomar uma amostra aleatria (com ou sem reposio) de um vetor populao x, permitindo que o usurio determine as probabilidades de selao de cada elemento em x; Gerar uma permutao do vetor x
Uso:
vetor de dados numricos, complexos ou caracteres a ser amostrado ou permutado (ou seja, a populao). Se x um inteiro positivo, uma amostra ou permutao ser tomada da seqencia 1: x. = tamanho da amostra (default: comprimento de x)
size
replace = FALSE (amostragem sem reposio) default = TRUE (amostragem com reposio) prob = vetor de probabilidade de seleo de cada elemento de x (default: probabilidades iguais)
Exemplos:
Se o comando for apenas sample(x), sendo o tamanho de x maior que 1, teremos uma permutao de x.
> potencia2 <- c(2, 4, 8, 16, 32, 64, 128, 256, 312, 624, 1248) > sample(potencia2) [1] 312 256 64 32 16 128 624 1248 4 2 8
Se o comando for sample(x,n,T) ou sample(x,n), sendo n < comprimento de x, teremos, respectivamente, uma amostra aleatria com ou sem reposio de x
> sample(potencia2,5,T) [1] 312 256 624 64 64 > sample(potencia2,5) [1] 32 312 128 8 2
Voc pode definir uma funo de probabilidade e gerar nmeros desta distribuio usando a funo sample:
A funo sample til na construo de rotinas para realizar testes de permutao ou aleatorizao.
1) Uma urna tem 10 bolas verdes, 8 bolas amarelas, 6 bolas azuis e 4 bolas brancas. Retire, aleatoriamente e sem reposio, 6 bolas desta urna.
> sample(rep(c("verde", "amarela", "azul", "branca"), c(10,8,6,4)), 6, F) [1] "verde" "branca" "amarela" "verde" "branca" "branca"
ou
> sample(c("verde", "amarela", "azul", "branca"), 6, T, c(10,8,6,4)) [1] "azul" "amarela" "verde" "amarela" "verde" "verde"
2) Use a funo sample para gerar 10 nmeros aleatrios de uma distribuio Bernoulli(0.6).
> sample(0:1,10, T,c(0.4,0.6)) [1] 0 1 0 0 1 1 1 0 1 1
Crie uma nova matriz, lx2, que a matriz lx com as linhas permutadas, mantendo a correspondncia entre as colunas (Ex: 2 e 20 tm que estar na mesma linha).
> lx2 <- lx[sample(3),] > lx2 [,1] [,2] [1,] 3 30 [2,] 1 10 [3,] 2 20
Exerccios:
32
Funo
min max range median quantile mean var cor sum prod cumsum cumprod
Tabela 6: Funes S-PLUS mais comuns para resumo de dados Descrio retorna o menor elemento no objeto numrico retorna o maior elemento do vetor retorna min e max dos elementos do vetor retorna a mediana dos valores constri quantiles para um conjunto de dados retorna a mdia retorna a varincia se o objeto um vetor e a matriz de covarincia se o objeto uma matriz, considerando as colunas como variveis retorna a a matriz de correlao da matriz, considerando as colunas como variveis soma todos os elementos multiplica todos os elementos somas acumulativas dos elementos de um vetor produtos acumulativos dos elementos de um vetor
A funo summary(x), aplicada a um objeto numrico, retorna os valores mdio, mediano, mnimo e mximo, primeiro e terceiro quartis e, se for o caso, o nmero de obervaes faltantes (NA).
> x <- rnorm(1000,0,1) > summary(x) Min. 1st Qu. Median Mean 3rd Qu. Max. -2.697 -0.6432 0.001229 0.003067 0.6828 3.339
A funo table(x1,x2,...,xn), retorna uma tabela de contingncia com o mesmo nmero de dimenses quanto o nmero de argumentos dados. Os argumentos so n objetos de mesmo tamanho, podendo ser numricos, caracteres ou lgicos.
> Pet <- factor(c("Cat","Dog","Cat","Dog","Cat","Cat")) > Food <- factor(c("Dry","Dry","Dry","Wet","Wet","Wet")) > table(Pet) Cat Dog 4 2 > table(Food) Dry Wet 3 3 > table(Pet,Food) Dry Wet Cat 2 2 Dog 1 1
Copyrigth Edna Afonso Reis
Tabela 7: Funes matemticas S-PLUS Funo Descrio abs valor absoluto round arredonda os valores no objeto numrico trunc arredonda os valores no objeto numrico sqrt raiz quadrada exp exponencial log logartmo natural gamma funo gamma sin, cos, tan seno, cosseno e tangente asin, acos, atan arco seno, arco cosseno e arco tangente
*
Voc pode usar a funo apply para aplicar uma determinada funo a todas as colunas ou linhas de uma matriz:
apply(matriz, MARGIN, FUN, ...)
onde
nome da funo a ser aplicada definio de argumentos opcionais da funo FUN 1, para aplicar a funo FUN em cada linha da matriz; 2, para aplicar a funo FUN em cada coluna da matriz;
34
Exerccios:
1) Sejam os seguintes conjuntos de dados:
> dresumo1a <- sample(10,10,T) > dresumo1a [1] 8 6 6 9 1 6 3 5 8 4 > dresumo1b <- sample(c(T,F), 10, T) > dresumo1b [1] F F F F F T T F T F > dresumo1c <- sample(c("F","M"),10,T) > dresumo1c [1] "F" "M" "F" "F" "F" "M" "M" "M" "F" "M" > dresumo1d <- rnorm(10,0,1) > dresumo1d [1] -0.3127440 -0.9258058 1.7417299 -0.2383481 -0.2323846 [6] 0.6220618 0.3111528 0.4751760 -0.7212297 0.4575782
Veja o resultado da aplicao das funes summary e table em cada desses conjuntos de dados.
> summary(dresumo1a) Min. 1st Qu. Median Mean 3rd Qu. Max. 1 4.25 6 5.6 7.5 9 > summary(dresumo1b) Length Mode 10 logical > summary(dresumo1c) Length Mode 10 character > summary(dresumo1d) Min. 1st Qu. Median Mean 3rd Qu. Max. -0.9258 -0.2941 0.03938 0.1177 0.4708 1.742 > table(dresumo1a) 1 3 4 5 6 8 9 1 1 1 1 3 2 1 > table(dresumo1b) FALSE TRUE 7 3 > table(dresumo1c) F M 5 5 > table(dresumo1d) -0.9258058 -0.7212297 -0.3127440 -0.2383481 -0.2323846 1 1 1 1 1 0.3111528 0.4575782 0.4751760 0.6220618 1.7417299 1 1 1 1 1
35 2) Seja a seguinte matriz de dados imaginrios onde cada linha representa uma criana. Na primeira coluna temos o cdigo da famlia da criana e na segunda, a idade da criana em anos.
> dresumo2 <- matrix(c(rep(c(1,2,3,4,5,6,7,8), c(2,3,1,5,3,2,3,1)), c(2,4,4,4,1,3,5,2,3,1,1,4,5,3,4,1,4,3,3,4)), ncol=2) > dimnames(dresumo2) <- list(1:20, c("Familia", "Idade")) > dresumo2 Familia Idade 1 1 2 2 1 4 3 2 4 4 2 4 5 2 1 6 3 3 7 4 5 8 4 2 9 4 3 10 4 1 11 4 1 12 5 4 13 5 5 14 5 3 15 6 4 16 6 1 17 7 4 18 7 3 19 7 3 20 8 4
Teste algumas das funes descritivas da Tabela 6, como nos passos dados abaixo:
> apply(dresumo3,2,mean) X1 X2 X3 X4 5.09478 5.715854 6.28831 6.527242 > apply(dresumo3,2,var) X1 X2 X3 X4 6.166301 6.06531 11.86693 12.98333 > sqrt(apply(dresumo3,2,var)) X1 X2 X3 X4 2.483204 2.462785 3.444841 3.603239 > apply(dresumo3,2,summary) X1 X2 X3 X4 Min. 1.253 1.922 1.337 2.529 1st Qu. 4.091 5.435 4.205 2.932 Median 6.118 5.497 7.447 7.471 Mean 5.095 5.716 6.288 6.527 3rd Qu. 6.482 7.349 9.179 9.731 Max. 7.529 8.376 9.274 9.973 > cor(dresumo3) X1 X2 X3 X4 X1 0.99999994 0.5204546 0.02530422 -0.1949437 X2 0.52045465 1.0000001 0.62553924 0.2239809 X3 0.02530422 0.6255392 1.00000000 -0.2736661 X4 -0.19494371 0.2239809 -0.27366608 1.0000000
A funo quantile aplicada a cada coluna da matriz, mas com as probabilidades modificadas no argumento probs:
> apply(dresumo3,2,quantile,probs=seq(0,1,0.20)) X1 X2 X3 X4 0% 1.253018 1.922411 1.337260 2.529495 20% 3.523651 4.732166 3.631108 2.851468 40% 5.307401 5.472109 6.149784 5.655506 60% 6.263696 6.237914 8.139517 8.375094 80% 6.691516 7.554499 9.197967 9.779269 100% 7.529399 8.376030 9.274226 9.972618
Copyrigth Edna Afonso Reis
37
7- Grficos
Os grficos (histogramas, box plots, scatter plots, etc...) so mostrados em janelas grficas que devem ser abertas no menu Tools/Grafic Device. Entretanto, os comandos para execuo dos grficos devem ser feitos na linha de coamando, como as funes. Por default, apenas um grfico ser desenhado na janela. Se deseja-se desenhar mais de um grfico na mesma janela, usa-se, antes de executar os comandos para desenh-los, a funo par(mfrow=c(no de linhas,no de colunas)), imaginando-se a tela grfica com uma matriz.
Exemplo: para desenhar seis grficos na tela, dispostos em uma matriz 2x3, usamos o comando
> par(mfrow=c(2,3))
antes dos comandos que desenham os grficos. A tela grfica continuar particionada desse modo at que se defina outra partio atravs do mesmo comando par(mfrow=...).
Histograma: x probability
hist(x,probability=F,...)
vetor numrico de dados para o histograma = TRUE, a altura das barras do histograma sero as densidades de probabilidade = FALSE, a altura das barras do histograma sero as contagens
Exemplo:
> hist(rt(100000, 100))
(Figura 1)
Box-plot: x1,...,xn
boxplot(x1,...,xn, ...)
Exemplo:
> boxplot(rpois(50,10),rpois(50,20),rpois(50,15))
(Figura 2)
38
tsplot(x1,...,xn, ...)
Exemplo:
> ts1 <- sin(seq(-pi,pi,len=100)) + rnorm(100,0,0.1) > ts2 <- cos(seq(-pi,pi,len=100)) + rnorm(100,0,0.1) > tsplot(ts1,ts2)
(Figura 3)
Grfico de disperso:
plot(x,y,...)
x,y Exemplo:
(Figura 4)
pairs(x)
Exemplo:
> > > > x1 <- runif(30,1,50) x2 <- runif(30,0,1) y <- 2 + 0.5*x1 + 4*x2 + rnorm(30,0,1) pairs(cbind(x1,x2,y))
(Figura 5)
Podemos fazer um grfico de dados tridimensionais em duas dimenses codificando a terceira varivel de acordo com o tamanho de um smbolo desenhado em cada localizao x-y. Os smbolos podem ser crculos, quadrados, retngulos, box-plots, etc.
symbols(x,y,circles=,squares=,...)
x,y
Exatamente um dos argumentos circles, squares, dentre outros, deve ser dado: circles squares
Copyrigth Edna Afonso Reis
= vetor contendo o raio dos crculos = vetor contendo o comprimento do lado do quadrado
(Figura 6)
40
41
42
43
Uso: Aps o comando que desenha o grfico, em uma das seguintes formas:
abline(a,b) abline(coef) abline(reg) abline(h=,v=)
intercepto e coeficiente de inclinao da linha a ser desenhada no grfico. vetor contendo intercepto a e coeficiente de inclinao b da reta y=a+b*x. um objeto de regresso, tal com o retornado pelas funes lsfit ou lm. = vetor de coordinadas y para as linhas horizontais a serem desenhadas no grfico. = vetor de coordinadas x para as linhas verticais a serem desenhadas no grfico.
Exemplos: Gere 100 pontos com coordenadas X ~ Uniforme(1,100) e Y= 5 + 0.9*X + Normal(0,10). Faa o grfico de disperso dos pontos e desenhe a linha com intercepto igual a 5 e coeficiente de inclinao igual a 0.9 (Figura 7).
X <- runif(100,1,100) Y <- 5 + 0.9*X + rnorm(100,0,10) plot(X,Y) abline(5,0.9)
Obs: A funo lm ajusta o modelo de regresso linear. Faa o histograma dos Y e desenhe um linha vertical na mdia dos valores (Figura 9)
Desenhe 100 pontos com coordenadas X e Y escolhidas em uma distribuio Uniforme(0,100) e sobreponha ao grfico uma grade com dez linhas horizontais e dez linhas verticais (Figura 10)
44 Figura 7
Figura 8
45 Figura 9
Figura 10
46
Adiciona pontos ao grfico corrente Adiciona pontos conectados com segmentos de linha ao grfico corrente
x,y
As coordenadas podem ser dadas, dentro outros, por: dois argumentos que so vetores, um nico argumento que uma matriz com duas colunas ou um nico argumento que uma srie temporal univariada.
Exemplo:
Vamos inicialmente construir um histograma (usando prob=T, ou seja, um histograma da densidade de probabilidade) de uma amostra aleatria de tamanho 100 mil da distribuio Normal(0,1):
> amostra <- rnorm(100000,0,1) > par(mfrow=c(3,1)) > hist(amostra,prob=T)
Deseja-se um esboo da curva de densidade de probabilidade da Normal(0,1) desenhado sobre este histograma. Precisamos, assim, definir quais pontos sero desenhados: coordenadas (x,y): (quantiles da N(0,1), respectivos valores na densidade N(0,1)). Vamos inicialmente criar um vetor com os valores de probabilidades para estes pontos:
> p <- seq(0.005,0.995,0.010) > p [1] [11] [21] [31] [41] [51] [61] [71] [81] [91] 0.005 0.105 0.205 0.305 0.405 0.505 0.605 0.705 0.805 0.905 0.015 0.115 0.215 0.315 0.415 0.515 0.615 0.715 0.815 0.915 0.025 0.125 0.225 0.325 0.425 0.525 0.625 0.725 0.825 0.925 0.035 0.135 0.235 0.335 0.435 0.535 0.635 0.735 0.835 0.935 0.045 0.145 0.245 0.345 0.445 0.545 0.645 0.745 0.845 0.945 0.055 0.155 0.255 0.355 0.455 0.555 0.655 0.755 0.855 0.955 0.065 0.165 0.265 0.365 0.465 0.565 0.665 0.765 0.865 0.965 0.075 0.175 0.275 0.375 0.475 0.575 0.675 0.775 0.875 0.975 0.085 0.185 0.285 0.385 0.485 0.585 0.685 0.785 0.885 0.985 0.095 0.195 0.295 0.395 0.495 0.595 0.695 0.795 0.895 0.995
Agora vamos criar as coordenadas dos pontos da Normal(0,1) que sero desenhados:
> x <- qnorm(p,0,1) > y <- dnorm(qnorm(p,0,1),0,1)
Observao: a seqncia em p tambm poderia ser criada atravs da funo ppoints(100). A vantagem de se usar a funo points est na simplicidade: automaticamente so gerados valores entre 0 e 1 (como requerido para probabilidades), necessitando-se apenas definir o nmero de pontos desejados, o que est relacionado com a preciso do desenho.
Copyrigth Edna Afonso Reis
48
Funes segments e arrows: Desenhando segmentos de linha deconectados ou flechas no grfico corrente
segments(x1,y1,x2,y2) arrows(x1,y1,x2,y2)
x1,y1,x2,y2
coordenadas X e Y dos pontos extremos dos segmentos ou flechas. Linhas sero desenhadas de (x1[i],y1[i]) a (x2[i],y2[i]).
Exemplos:
> x <- runif(100,1,100) > y <- runif(100,1,100) > par(mfrow=c(2,2)) > plot(x,y) > segments(min(x),min(y),max(x),max(y)) > plot(x,y) > arrows(min(x),min(y),max(x),max(y))
49
Sintaxe geral
A sintaxe geral para definir uma nova funo a partir da linha de comando :
nome: nome que voc escolhe para a funo argumentos: os argumentos necessrios para a funo, separados por vrgula corpo: conjunto de comandos (tarefas) necessrios para que a funo retorne o valor desejado
Exemplo: Vamos construir uma funo que, dado um vetor de valores, retorne os valores padronizados.
> padroniza <- function(x) { z <- (x-mean(x))/sqrt(var(x)) z }
Testando:
> x <- 1:7 > z <- padroniza(x) > z [1] -1.3887301 -0.9258201 -0.4629100
0.0000000
0.4629100
0.9258201
1.3887301
O ltimo objeto que se faz referncia antes de fechar a funo com } o objeto que ser retorna pela funo. Nesse caso o objeto z.
Copyrigth Edna Afonso Reis
50 Tendo visto esse exemplo bem simples, vamos generalizar algumas observaes sobre os elementos da sintaxe geral nome <- function( argumentos ) {corpo }. 1. Voc pode colocar valores default para alguns ou todos os argumentos colocando na frente do nome do argumento a expresso =valordefault. Os argumentos que no tiverem um valor default so os argumentos obrigatrios ao chamar a funo. 2. Os objetos criados dentro do corpo da funo so locais quela funo, ou seja, s existem na memria apenas durante a execuo da funo. Assim, voc pode dar nomes a objetos dentro da funo iguais a objetos no diretrio de dados. 3. Voc pode colocar comentrios no corpo da funo usando o smbolo # antes do comentrio. 4. A funo ir retornar apenas um objeto, que pode ser um vetor, uma matriz ou uma lista, etc. O nome do objeto a ser referenciado deve aparecer (sozinho) na ltima linha antes do } final. Se nenhum nome aparecer no final do corpo da funo, ser retornado valor da ltima expresso avaliada no corpo da funo.
Exemplo: Vamos fazer uma funo para realizar o Teste t de comparao de duas amostras independentes. Para simplicidade inicial, o teste dever ser unilateral: H1: mdia da primeira amostra > mdia da segunda amostra O teste deve retornar: o tamanho das amostras; a mdia e o desvio padro das duas amostras; a diferena entre as duas mdias e o desvio padro combinado (s_pooled); o valor da estattica de teste t e o valor de comparao na distribuio t nula; o valor p do teste e o nvel de significncia escolhido (com default=0.05).
ttest <- function(y1,y2,alpha=0.05) { #y1 e y2: vetores com a primeira e a segunda amostra, respectivamente #alpha: nivel de significancia do teste (default=0.05) n1 <- length(y1) n2 <- length(y2) ngl <- n1 + n2 -2 sp <- sqrt( ((n1-1)*var(y1) + (n2-1)*var(y2))/ngl) tstat <- (mean(y1)-mean(y2))/(sp*sqrt(1/n1+1/n2)) tc <- qt(0.95,ngl) valorp <- 1-pt(tstat,ngl)
# numero de graus de liberdade da distribuicao t sob Ho # s_pooled # valor da estatstica de teste # valor de comparacaao sob Ho # valor p
# Vamos agrupar todos os resultados requeridos em uma lista: resultado <- list( c(n1,n2), c(mean(y1),mean(y2)), c(sqrt(var(y1)),sqrt(var(y2))), c(mean(y1)-mean(y2), sp), c(tstat,tc), c(valorp, alpha)) }
Copyrigth Edna Afonso Reis
[[3]]: [1] 3.230817 5.021282 [[4]]: [1] 7.493518 4.348808 [[5]]: [1] 7.134394 1.667572 [[6]]: [1] 4.06001e-010 1.00000e-001
Expressando condies
Em algumas funes que construmos necessrio avaliar condies para que uma determinada tarefa seja realizada, especialmente dentro de loops (veja prxima seo). Os clculos condicionais so feitos atravs da conhecida construo if-else.
if ( condio1) else if ( condio2) else if ( condio3) else
{ tarefa a ser realizada se condio1 = TRUE } { tarefa a ser realizada se condio2 = TRUE } { tarefa a ser realizada se condio3 = TRUE }
...
onde condio uma expresso que resulta em um nico valor lgico (T ou F). Assim, as condies 1,2,..., N so mutuamente excludentes, e uma certa condio ser realizada se todas as outras forem FALSE. Mas podemos ter estruturas mais simples, como no exemplo a seguir.
Exemplo: Voc pode usar uma expresso condicional if simples, sem else:
if(mean(x) > median(x)) {estimativa <- y}
52 Podemos testar mltiplas condies usando os operadores & e | representam E e OU, respectivamente:
if ( condio1 & condio2) { tarefa a ser realizada se as duas condies so TRUE } if ( condio1 | condio2){ tarefa a ser realizada se ao menos uma das condies TRUE }
Exemplo: Voc pode usar uma expresso condicional if simples, sem else:
if(idade < 10) {idade2 else if(idade >= 10 & idade < 20) {idade2 else if(idade >= 20 & idade < 40) {idade2 else if(idade >= 40 & idade < 60) {idade2 else {idade2 <<<<<1} 2} 3} 4} 5}
Iterao
Voce pode desejar fazer uma srie de tarefas repetidas dentro de uma funo (ou at mesmo fora). As tarefas iterativas (loops) podem ser feitas atravs dos comandos for, while e repeat.
O comando for permite que uma tarefa seja repetida medida que uma varivel assume valores em uma seqncia especfica:
for ( varivel in seqncia) { tarefas }
Exemplo: Vamos escrever uma funo que gere um vetor com as somas acumuladas dos elementos de um vetor dado (tarefa da funo cumsum, j vista).
soma.fun <- function(x) { n <- length(x) soma <- NULL #vetor onde sero armazenadas as somas y <- 0 #Percorrendo cada elemento do vetor x for (i in 1:n) { y <- y + x[i] soma <- c(soma, y) } soma }
Vamos criar um loop que gere uma nova matriz V (15x15), bloco diagonal, onde os blocos so todos iguais matriz blocoV:
V <- matrix(0, 15, 15) for (i in seq(1, 15, by=5)) { V[c(i:(i+4)),c(i:(i+4))] <- blocoV }
> V [1,] [2,] [3,] [4,] [5,] [6,] [7,] [8,] [9,] [10,] [11,] [12,] [13,] [14,] [15,] [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] [,11] [,12] [,13] [,14] [,15] 1 2 3 4 5 0 0 0 0 0 0 0 0 0 0 6 7 8 9 10 0 0 0 0 0 0 0 0 0 0 11 12 13 14 15 0 0 0 0 0 0 0 0 0 0 16 17 18 19 20 0 0 0 0 0 0 0 0 0 0 21 22 23 24 25 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 2 3 4 5 0 0 0 0 0 0 0 0 0 0 6 7 8 9 10 0 0 0 0 0 0 0 0 0 0 11 12 13 14 15 0 0 0 0 0 0 0 0 0 0 16 17 18 19 20 0 0 0 0 0 0 0 0 0 0 21 22 23 24 25 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 2 3 4 5 0 0 0 0 0 0 0 0 0 0 6 7 8 9 10 0 0 0 0 0 0 0 0 0 0 11 12 13 14 15 0 0 0 0 0 0 0 0 0 0 16 17 18 19 20 0 0 0 0 0 0 0 0 0 0 21 22 23 24 25
Exemplo: (retirado de Venables and Ripley (1994), pgina 88) Considere o problema de encontrar o estimador de mxima verossimilhana do parmetro da distribuio de Poisson truncada em zero:
O comando while permite que uma tarefa seja repetida enquanto uma condio (expresso com resultado lgico) verdadeira:
while ( condio) { tarefas }
e y P (Y = y ) = (1 e ) y !
y = 1,2,...
54 A mdia
E (Y ) =
, 1 e
e a estimativa de mxima verossimilhana encontrada igualando-se a mdia amostral sua esperana: expresso que pode ser reescrita como
$ # $
y=
, 1 e
#
Assim, o Mtodo de Newton-Raphson, que vamos implementar, leva ao seguinte esquema de iterao:
1 ye
'
m +1 = m m .
Inicialmente, vamos gerar uma amostra da distribuio de Poisson( = 1) e eliminar todos os zeros para obtermos uma amostra da distribuio de Poisson truncada em zero:
> y <- rpois(50,1) > table(y) 0 1 2 3 4 19 15 11 3 2 > y <- y[y > 0] # amostra de tamanho 31 da Poisson(1) truncada em zero # amostra de tamanho 50 da Poisson(1) completa
Vamos ter uma condio de parada baseada na convergncia (m < 0.0001) e no nmero mximo de iteraes que aceitamos (10). O valor inicial ser 0 = y .
> ybar <- mean(y) > ybar [1] 1.741935 > lambda <- ybar > delta <- 1 > itera <- 0 > while (abs(delta) > 0.0001 & (itera <- itera + 1) < 10) { delta <- (lambda - ybar*(1- exp(-lambda)))/(1- ybar*exp(-lambda)) lambda <- lambda - delta cat(itera, delta, lambda, "\n") #comando para imprimir } 1 2 3 4 0.439167859831138 0.065047900315307 0.002068981399284 0.000002191817381 1.30276762403983 1.23771972372452 1.23565074232524 1.23564855050786
) (
'
&
m +1 = m
m y (1 e m )
%
&
"
= y (1 e ) .
55
0
O comando repeat permite que uma tarefa seja repetida indefinidadamente, a no ser que a condio no comando break seja satisfeita:
56
9- Consideraes Finais
No Apndice, so apresentados dois exemplos de arquivo de Help: funes mean e hist. Os arquivos de Help do S-PLUS seguem essa estrutura: uma breve descrio da funo, seguida pela sintaxe e descrio dos argumentos, os valores retornados, detalhes da funo, referncias do assunto (se for o caso), indicao de tpicos relacionados e exemplos de uso. Tambm no Apndice, apresento uma cpia do ndice do manual S-PLUS Guide to Statistical and Mathematical Analysis, que mostra as tcnicas estatsticas implementadas naquela verso do SPLUS. Atualmente, outras tcnicas foram implementadas no S-PLUS, seja atravs de novos mdulos (como o mdulo para Estatstica Espacial) ou das bibliotecas de funes S-PLUS criadas para implementar determinado tipo de anlise estatstica (como o OSWALD, para Anlise de Dados Longitudinais).
Cursos e dicas:
Lista eletrnica:
Tire suas dvidas sobre S-PLUS com outros usurios ou resolva algumas via e-mail atravs da lista eletrnica S-News. Pare se inscrever na lista, mande uma mensagem para:
s-news-request@utstat.toronto.edu
57
Apndice
Exemplos do contedo do Help on Line Contedo do manual Guide to Statistical and Mathematical Analysis