Sie sind auf Seite 1von 57

Universidade Federal de Minas Gerais Instituto de Cincias Exatas Departamento de Estatstica

Noes Bsicas de S-PLUS for Windows

Edna Afonso Reis

Primeira Edio - Setembro de 1997

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):

Noes bsicas: A Gentle Introduction to S-PLUS A Crash Course in S-PLUS

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.

Edna Afonso Reis Belo Horizonte, 1997

Copyrigth Edna Afonso Reis

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

Copyrigth Edna Afonso Reis

1- Aspectos Gerais do S-PLUS


Aps iniciar o S-PLUS, aparecer na janela Commands a seguinte mensagem:
S-PLUS : Copyright 1988, 1995 MathSoft, Inc. S : Copyright AT&T. Version 3.3 Release 1 for MS Windows 3.1 : 1995 Working data will be in _Data

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

ENTER ENTER ENTER ENTER

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

ENTER > pi [1] 3.141593

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

Para ver o contedo de x:


> x [1] 10

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)

O objeto x deixa de existir:


> x Error: Object "x" not found

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"

Copyrigth Edna Afonso Reis

2- A organizao de dados no S-PLUS


Antes de fazer a anlise de seus dados no S-PLUS, voc deve convert-los, dentro do programa, para a forma de objetos de dados S-PLUS. O tipo de dado ir depender da natureza dos seus dados: uma simples seqncia de nmeros mais facilmente representada como um vetor, enquanto dados de um planilha (colunas representando variveis e linhas representando indiduos) so melhor representados como uma matriz ou data frame. O S-PLUs possui uma grande variedade de tipos de dados. Nesta apostila, vamos concentrar nossa ateno em quatro tipos:
vector

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

matrix data frame

list

Os elementos de um objeto podem ser dos seguintes modos:


logical numeric complex character

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.

O nmero de elementos de um vetor o seu length :


> length(carro.gas) [1] 118

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()

Copyrigth Edna Afonso Reis

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

Quando terminar, pressione ENTER em uma linha vazia:


> notas <- scan() 1: 95 90 98 4: 99 87 6: >

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

Outro modo de criar um vetor dentro do S-PLUS usar a funo c:


> notas <- c(95,90,98,99,87) > notas [1] 95 90 98 99 87

Vetores de dados no-numricos

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

Copyrigth Edna Afonso Reis

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

> 12:18 [1] 12 13 14 15 16 17 18

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:

Copyrigth Edna Afonso Reis

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: >

ou usando-se a funo c para combinar os valores:


> notas.mat <-matrix(c(95,94,96,90,89,90,98,95,99,99,97,100,87,86,88), ncol=3, byrow=T)

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)

usamos a funo cbind para combin-los como colunas da matriz notas.mat:


> notas.mat <- cbind(notas.p1, notas.p2, notas.p3)
Copyrigth Edna Afonso Reis

11 Se temos cinco vetores com as notas de cada aluno,


> > > > > notas.a1 notas.a2 notas.a3 notas.a4 notas.a5 <<<<<c(95,94,96) c(90,89,90) c(98,95,99) c(99,97,100) c(87,86,88)

usamos a funo rbind para combin-los como linhas da matriz notas.mat:


> notas.mat <- rbind(notas.a1,notas.a2,notas.a3,notas.a4,notas.a5)

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

l os dados de um arquivo externo combina objetos S-PLUS de vrios modos

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:

Copyrigth Edna Afonso Reis

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

Copyrigth Edna Afonso Reis

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

Por enquanto a matriz no tem nome nas linhas e colunas:


> dimnames(notas.mat) NULL

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"))

e associar essa lista s dimenses da matriz notas.mat:


> dimnames(notas.mat) <- notas.list > 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 > dimnames(notas.mat) [[1]]: [1] "Ariadne" "Joel"

"Alana"

"Agnes"

"Juan"

[[2]]: [1] "Prova1" "Prova2" "Prova3"

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"

$Provas: [1] "Prova1" "Prova2" "Prova3"

E voc pode se referir a cada componente pelo seu nome:


> dimnames(notas.mat)$Alunos [1] "Ariadne" "Joel" "Alana" > dimnames(notas.mat)$Provas [1] "Prova1" "Prova2" "Prova3"
Copyrigth Edna Afonso Reis

"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)

Expressando Dados Faltantes no S-PLUS


Um valor faltante (missing value) representado pelo smbolo NA (Not Avaliable), com letras maisculas. Por exemplo, se no vetor notas a nota do terceiro aluno no est disponvel, colocamos NA na terceira posio do vetor:
> notas2 <- c(95,90,NA,99,87) > notas2 [1] 95 90 NA 99 87

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.

Extraindo subconjuntos de dados

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

ou, como as linhas e colunas tm nomes:


> notas.mat["Agnes", "Prova2"] [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

Agora vamos saber quais destas notas obedecem condio:


> p2 >= 90 Ariadne Joel Alana Agnes Juan T F T T F

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

Copyrigth Edna Afonso Reis

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

ou usar expresses encaixadas


> list1[[2]][4,] Prova1 Prova2 Prova3 99 97 100

Substuindo subconjuntos de dados

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

Note que a matriz notas.mat[4:5,1:2] preenchida por colunas.

Operaes com vetores e matrizes

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

> x/y [1] 0.4000000 0.4285714 0.5555556 8.0000000 2.0000000 0.6666667

Voc pode multiplicar todos os elementos do vetor por 10, por exemplo:
> 10*x [1] 20 30 50 80 60 40

ou subtrair 2 de todos eles:


> x-2 [1] 0 1 3 6 4 2
Copyrigth Edna Afonso Reis

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

510 600 690

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

> 2*x/(x+y)^2 [1] 0.08163265 0.06000000 0.05102041 0.19753086 0.14814815 0.08000000


Copyrigth Edna Afonso Reis

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 # verdadeiro # falso # falso # verdadeiro # verdadeiro

verdadeiro

= verdadeiro = verdadeiro = falso = falso = falso = verdadeiro

OU verdadeiro E falso

OU falso E falso

OU falso

O operador de negao !, quando aplicado a um vetor lgico, converte os valores T em F e viceversa:


> aux <- notas.mat[,2] >= 90 > p2.cA <- p2[aux] > p2.cB <- p2[!aux] > p2.cA Ariadne Alana Agnes 94 95 99 > p2.cB Joel Juan 89 85

Copyrigth Edna Afonso Reis

23 Ordenando os dados

sort rev order rank

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).

Extraindo valores repetidos

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:

> 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 > unique(x) [1] 4 2 8 10 6

Copyrigth Edna Afonso Reis

> duplicated(x) [1] F F T F T F F T T

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

2) Coloque os elementos do vetor x em ordem crescente e decrescente:


> x <- c(2,11,1,15,3,7,13,8,12,6) > sort(x) [1] 1 2 3 6 7 8 11 12 13 15 > rev(sort(x)) [1] 15 13 12 11 8 7 6 3 2 1

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

Copyrigth Edna Afonso Reis

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

var.test(x,y, alternative= "two.sided", conf.level= .95)


argumentos obrigatrios

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)

Copyrigth Edna Afonso Reis

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:

var.test(sample1, sample2, conf.level=.9, alternative="greater")

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:

Voltando funo var.test, sejam as seguintes amostras a serem comparadas:


> amostra1 <- c(2.7, > amostra2 <- c(2.3, 6.4, 7.4, 10.9, 16.1, 16.2, 17.7) 4.4, 4.5, 6.9, 9.6, 11.5, 13.8)

Aplicando a funo var.test, temos:


> var.test(amostra1,amostra2)
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

Copyrigth Edna Afonso Reis

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

E recuperar cada elemento da lista:


> vtest1[[1]] F 1.894306 > vtest1[[2]] num df denom df 6 6 > vtest1[[3]] [1] 0.4564665 > vtest1[[4]] [1] 0.3254957 11.0243991 attr(, "conf.level"): [1] 0.95 > vtest1[[5]] variance of x variance of y 33.48952 17.67905 > vtest1[[6]] ratio of variances 1 > vtest1[[7]] [1] "two.sided" > vtest1[[8]] [1] "F test for variance equality" > vtest1[[8]] [1] "F test for variance equality" > vtest1[[9]] [1] "amostra1 and amostra2"


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

5- Distribuies de Probabilidade e Nmeros Aleatrios


O S-PLUS tem muitas funes para realizar clculos de probabilidade, incluindo gerao de nmeros aleatrios de determinadas distribuies de probabilidade. Essas funes tm a seguinte forma geral:

letranome(argumentos separados por vrgula)

letra que indica a operao

nome da distribuio de probabilidade

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).

Copyrigth Edna Afonso Reis

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

2) Seja Z ~ Normal(0,1) a) Calcule a P(Z<-1.64)


> pnorm(-1.64,0,1) [1] 0.05050258

b) Calcule a P(Z>1.96)
> 1- pnorm(1.96,0,1) [1] 0.0249979

3) Seja Z ~ Normal(0,1) a) Encontre k tal que P(Z<k)=0.05


> qnorm(0.05,0,1) [1] -1.644854

b) Encontre K tal que P(Z>k)=0.025


> qnorm(1-0.025,0,1) [1] 1.959964

4) Calcule P(X=5) onde X ~ Binomial(10,0.5)


> dbinom(5,10,0.5) [1] 0.2460938


Copyrigth Edna Afonso Reis

30

Funo sample:

Gerao de amostras aleatrias ou permutao dos dados

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:

sample(x, size=<<veja abaixo>>, replace=F, prob=<<veja abaixo>>)

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 x um inteiro positivo, sample(x) resultar em uma permutao da seqencia 1:x.


sample(10) [1] 9 7 1 6 10 4 8 2 3 5

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

Copyrigth Edna Afonso Reis

31 ou da seqencia 1:x, se x inteiro positivo


> sample(10,5,T) [1] 3 8 4 8 4 > sample(10,5) [1] 6 7 1 2 4

Voc pode definir uma funo de probabilidade e gerar nmeros desta distribuio usando a funo sample:

> sample(4, 30, prob=c(0.1,0.2,0.3,0.4), replace=T) [1] 2 4 1 3 3 3 3 4 4 4 4 2 3 4 4 3 4 3 2 3 3 3 2 1 4 2 4 3 1 1

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

3) Seja matriz lx:


> lx <- matrix(c(1:3,10*(1:3)),ncol=2) > lx [,1] [,2] [1,] 1 10 [2,] 2 20 [3,] 3 30

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

Copyrigth Edna Afonso Reis

Exerccios:

32

6- Algumas funes teis na Anlise Exploratria dos dados


Apresento aqui algumas funes para descrever, resumir, fazer transformaes numricas ou operaes matemticas com os dados.

Descrevendo e resumindo os dados

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

*Todas essas funes operam com objetos numricos

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

33 Funes matemticas - Transformaes numricas nos dados

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
*

*Todas essas funes operam com objetos numricos

Operaes repetidas: a funo apply

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

FUN ... MARGIN

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;

Exemplo: Seja a matriz mat1 a seguir:


> mat1 <- matrix(sample(20), ncol=4, byrow=T) > mat1 [,1] [,2] [,3] [,4] [1,] 3 19 2 12 [2,] 20 1 4 10 [3,] 8 11 17 6 [4,] 9 7 18 16 [5,] 13 14 15 5

Vamos criar um vetor que receba a mdia de cada coluna de mat1:


> mean.mat1 <- apply(mat1, 2, mean) > mean.mat1 [1] 10.6 10.4 11.2 9.8

e um vetor que receba a mdia truncada a 40% de cada coluna de mat1:


> meantruc.mat1 <- apply(mat1, 2, mean, trim=0.4) > meantruc.mat1 [1] 9 11 15 10
Copyrigth Edna Afonso Reis


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

Veja o resultado do comando table(dresumo1b,dresumo1c).


> table(dresumo1b,dresumo1c) F M FALSE 4 3 TRUE 1 2
Copyrigth Edna Afonso Reis

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

Veja o resultado da funo table(dresumo2[,1]) .


> table(dresumo2[,1]) 1 2 3 4 5 6 7 8 2 3 1 5 3 2 3 1

Cdigos de famlia (8 famlias diferentes) Nmero de crianas em cada famlia (soma=20)

Interprete o resultado da funo table(table(dresumo[,1])).


> table(table(dresumo2[,1])) 1 2 3 5 2 2 3 1

Nmero n de crianas por famlia Nmero de famlias com n crianas

A primeira tabela responde perguntas do tipo:


 

Quantas crianas tem a famlia 4 ? Resposta: Cinco crianas.

A segunda tabela responde perguntas do tipo:

Quantas famlias tm 5 crianas ? Resposta: Apenas uma famlia.


Copyrigth Edna Afonso Reis

36 3) Seja a matriz de dados construda a seguir:


> dresumo3 <- matrix(runif(20,1,10),ncol=4) > dimnames(dresumo3) <- list(1:5, c("X1","X2","X3","X4")) > dresumo3 X1 X2 X3 X4 1 4.091309 1.922411 4.204570 2.931961 2 6.118130 7.349116 9.274226 2.529495 3 6.482045 5.497112 1.337260 9.730932 4 1.253018 5.434604 7.446593 9.972618 5 7.529399 8.376030 9.178902 7.471203

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, usando as probabilidades default:


> apply(dresumo3,2,quantile) X1 X2 X3 X4 0% 1.253018 1.922411 1.337260 2.529495 25% 4.091309 5.434604 4.204570 2.931961 50% 6.118130 5.497112 7.446593 7.471203 75% 6.482045 7.349116 9.178902 9.730932 100% 7.529399 8.376030 9.274226 9.972618

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=...).

Alguns grficos teis na Anlise Exploratria dos dados

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, ...)

vetores com os dados. Produz n box-plots no mesmo grfico

Exemplo:
> boxplot(rpois(50,10),rpois(50,20),rpois(50,15))

(Figura 2)

Copyrigth Edna Afonso Reis

38

Srie temporal: x1,...,xn

tsplot(x1,...,xn, ...)

vetores com os dados. Produz um grfico com n sries temporais

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:

variveis (vetores) para o grfico de disperso

> x <- runif(30,1,50) > y <- 2 + 0.5*x + rnorm(30,0,1) > plot(x,y)

(Figura 4)

Grfico de disperso de pares de variveis: uma matriz, por exemplo

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)

Desenhando smbolos em um grfico:

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

Coordenadas X e Y dos pontos (vetores)

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

39 Exemplo: Coordenadas da localizao certa espcie de rvore em um parque:


> x <- runif(20,0,100) > y <- runif(20,0,100)

Dimetro (em centmetros) do tronco da rvore:


> z <- round(abs(rnorm(20,100,50)))

Mapa com a localizao das rvores e representao de seu dimetro:


> symbols(x,y,circle=z,inches=0.5)

(Figura 6)

Copyrigth Edna Afonso Reis

40

Figura 1: Exemplo de aplicao da funo hist

Figura 2: Exemplo de aplicao da funo boxplot

Copyrigth Edna Afonso Reis

41

Figura 3: Exemplo de aplicao da funo tsplot

Figura 4: Exemplo de aplicao da funo plot

Copyrigth Edna Afonso Reis

42

Figura 5: Exemplo de aplicao da funo pairs

Figura 6: Exemplo de aplicao da funo symbols

Copyrigth Edna Afonso Reis

43

Funo abline: Adicionando uma linha ao grfico corrente


Adiciona a linha y=a+b*x ou linhas horizontais e verticais ao grfico corrente.

Uso: Aps o comando que desenha o grfico, em uma das seguintes formas:
abline(a,b) abline(coef) abline(reg) abline(h=,v=)

a,b coef reg 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)

> > > >

Desenhe a reta de regresso ajustada dos Y nos X do exemplo anterior (Figura 8)

> plot(X,Y) > abline(lm(Y~X))

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)

> hist(Y) > abline(v=mean(Y))

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)

> plot(runif(100,0,100),runif(100,0,100)) > abline(v=c(1:10)*10, h=c(1:10)*10)


Copyrigth Edna Afonso Reis

44 Figura 7

Figura 8

Copyrigth Edna Afonso Reis

45 Figura 9

Figura 10

Copyrigth Edna Afonso Reis

46

Funes points e lines: Adicionando pontos ou linhas ao grfico corrente


points(x,y) lines(x,y)

Adiciona pontos ao grfico corrente Adiciona pontos conectados com segmentos de linha ao grfico corrente

x,y

Coordenadas X e Y dos pontos.

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)

Copyrigth Edna Afonso Reis

47 E agora finalmente esboar a curva da densidade da Normal(0,1) com pontos ou linhas:


> hist(amostra,prob=T) > points(x,y) > hist(amostra,prob=T) > lines(x,y)

Figura 11: Exemplos de aplicao das funes ppoints e lines

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)

Adiciona segmentos de linha ao grfico corrente Adiciona flechas ao grfico corrente

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))

Figura 12: Exemplos de aplicao das funes segments e arrows

Copyrigth Edna Afonso Reis

49

8- Escrevendo funes S-PLUS


Uma das grandes vantagens do S-PLUS que ele nos permite escrever nossas prprias funes na linguagem S-PLUS. Isso o torna uma ferramenta poderosa para testar novas metodologias e realizar simulaes. A nova funo S-PLUS que voc construir poder ser completamente nova (um novo estimador que voc est propondo, por exemplo) ou apenas uma modificao personalizada de uma funo SPLUS existente. Voc pode desejar ainda usar as funes j existentes de modo repetido no seu conjunto de dados - seu trabalho ser facilitado incorporando estas tarefas em uma nica funo. Vamos ver agora os conceitos bsicos da construo de funes S-PLUS e alguns exemplos simples. Para uma discusso completa, veja o S-PLUS Programmers Manual.

Sintaxe geral
A sintaxe geral para definir uma nova funo a partir da linha de comando :

nome <- function( argumentos ) {corpo }

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

Obervaes sobre funo padroniza:


x z

o nico argumento da funo. Note que z no foi criado no diretrio de dados.

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

51 Aplicando em duas amostras independentes geradas de distribuies Normais:


> result <- ttest(rnorm(30,12,5),rnorm(40,8,5),alpha=0.10) > result [[1]]: [1] 30 40 [[2]]: [1] 13.903936 6.410418

[[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 }
...

{ tarefa a ser realizada se todas as condies = FALSE}

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}

ou colocar uma alternativa para o caso em que a condio seja falsa:


if(mean(x) > median(x)) else {estimativa <- mean(x)} {estimativa <- median(x)}

Copyrigth Edna Afonso Reis

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 }

> soma.fun(1:5) [1] 1 3 6 10 15

Copyrigth Edna Afonso Reis

53 Exemplo: Seja a seguinte matriz:


> blocoV <- matrix(1:25, ncol=5, byrow=T) > blocoV [,1] [,2] [,3] [,4] [,5] [1,] 1 2 3 4 5 [2,] 6 7 8 9 10 [3,] 11 12 13 14 15 [4,] 16 17 18 19 20 [5,] 21 22 23 24 25

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:

que corresponde a observar apenas valores no nulos da distribuio de Poisson.


Copyrigth Edna Afonso Reis

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
) (

Copyrigth Edna Afonso Reis

'

que pode ser reescrito como

&

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:

repeat { tarefas ( incluindo avaliao para break ) }

Exemplo: No exemplo anterior, o loop pode ser feito usando repeat:


> lambda <- ybar > delta <- 1 > itera <- 0 > repeat { delta <- (lambda - ybar*(1- exp(-lambda)))/(1- ybar*exp(-lambda)) lambda <- lambda - delta cat(itera, delta, lambda, "\n") if(abs(delta) <= 0.0001 | (itera <- itera + 1) >= 10) break } 1 2 3 4 0.439167859831138 0.065047900315307 0.002068981399284 0.000002191817381 1.30276762403983 1.23771972372452 1.23565074232524 1.23564855050786
1

Copyrigth Edna Afonso Reis

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).

10- S-PLUS na Internet


Informaes e compra: www.mathsoft.com/splus.html/

Cursos e dicas:

Introdution to S-PLUS (University of Toronto):


utstat.toronto.edu/splus/contents.html

Frequently Asked Questions about S (ETH Zurich):


www.stat.math.ethz.ch/S-FAQ/

Info on running S-PLUS (University of Wisconsin):


www.stat.wisc.edu/computing/splus/

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

As mensagens j enviadas esto em:


www.stat.cmu.edu/s-news/

Copyrigth Edna Afonso Reis

57

Apndice

Exemplos do contedo do Help on Line Contedo do manual Guide to Statistical and Mathematical Analysis

(cpias xerox a parte)

Copyrigth Edna Afonso Reis

Das könnte Ihnen auch gefallen