Vamos começar ``experimentando o R'', para ter uma idéia de seus recursos e a forma de trabalhar. Para isto vamos rodar e estudar os comandos abaixo e seus resultados para nos familiarizar com o programa. Nas sessões seguintes iremos ver com mais detalhes o uso do programa R. Siga os seguintes passos.
# gerando dois vetores de coordenadas x e y de números pseudo-aleatórios # e inspecionando os valores gerados x <- rnorm(5) x y <- rnorm(x) y # colocando os pontos em um gráfico. # Note que a janela gráfica se abrirá automaticamente plot(x, y) # verificando os objetos existentes na área de trabalho ls() # removendo objetos que não são mais necessários rm(x, y) # criando um vetor com uma sequência de números de 1 a 20 x <- 1:20 # um vetor de pesos com os desvios padrões de cada observação w <- 1 + sqrt(x)/2 # montando um `data-frame' de 2 colunas, x e y, e inspecionando o objeto dummy <- data.frame(x=x, y= x + rnorm(x)*w) dummy # Ajustando uma regressão linear simples de y em x e examinando os resultados fm <- lm(y ~ x, data=dummy) summary(fm) # como nós sabemos os pesos podemos fazer uma regressão ponderada fm1 <- lm(y ~ x, data=dummy, weight=1/w^2) summary(fm1) # tornando visíveis as colunas do data-frame attach(dummy) # fazendo uma regressão local não-paramétrica, e visualizando o resultado lrf <- lowess(x, y) plot(x, y) lines(lrf) # ... e a linha de regressão verdadeira (intercepto 0 e inclinação 1) abline(0, 1, lty=3) # a linha da regressão sem ponderação abline(coef(fm)) # e a linha de regressão ponderada. abline(coef(fm1), col = "red") # removendo o objeto do caminho de procura detach() # O gráfico diagnóstico padrão para checar homocedasticidade. plot(fitted(fm), resid(fm), xlab="Fitted values", ylab="Residuals", main="Residuals vs Fitted") # gráficos de escores normais para checar assimetria, curtose e outliers (não muito útil aqui) qqnorm(resid(fm), main="Residuals Rankit Plot") # ``limpando'' novamente (apagando objetos) rm(fm, fm1, lrf, x, dummy)
Agora vamos inspecionar dados do experimento clássico de Michaelson e Morley para medir a velocidade da luz.
Clique para ver o arquivo morley.tab
de dados no formato texto.
Gravar este arquivo no diretório c:\temp
.
# para ver o arquivo digite: file.show("c:\\temp\\morley.tab.txt") # Lendo dados como um 'data-frame' e inspecionando seu conteúdo. # Há 5 experimentos (coluna Expt) e cada um com 20 ``rodadas''(coluna # Run) e sl é o valor medido da velocidade da luz numa escala apropriada mm <- read.table("c:\\temp\\morley.tab.txt") mm # definindo Expt e Run como fatores mm$Expt <- factor(mm$Expt) mm$Run <- factor(mm$Run) # tornando o data-frame visível na posição 2 do caminho de procura (default) attach(mm) # comparando os 5 experimentos plot(Expt, Speed, main="Speed of Light Data", xlab="Experiment No.") # analisando como blocos ao acaso com `runs' and `experiments' como fatores e inspecionando resultados fm <- aov(Speed ~ Run + Expt, data=mm) summary(fm) names(fm) fm$coef # ajustando um sub-modelo sem ``runs'' e comparando via análise de variância fm0 <- update(fm, . ~ . - Run) anova(fm0, fm) # desanexando o objeto e limpando novamente detach() rm(fm, fm0)
Vamos agora ver alguns gráficos gerados pelas funções contour e image.
# x é um vetor de 50 valores igualmente espaçados no intervalo [-pi\, pi]. y idem. x <- seq(-pi, pi, len=50) y <- x # f é uma matrix quadrada com linhas e colunas indexadas por x e y respectivamente # com os valores da função cos(y)/(1 + x^2). f <- outer(x, y, function(x, y) cos(y)/(1 + x^2)) # gravando parâmetros gráficos e definindo a região gráfica como quadrada oldpar <- par(no.readonly = TRUE) par(pty="s") # fazendo um mapa de contorno de f e depois adicionando mais linhas para maiores detalhes contour(x, y, f) contour(x, y, f, nlevels=15, add=TRUE) # fa é a ``parte assimétrica''. (t() é transposição). fa <- (f-t(f))/2 # fazendo um mapa de contorno contour(x, y, fa, nlevels=15) # ... e restaurando parâmetros gráficos iniciais par(oldpar) # Fazendo um gráfico de imagem image(x, y, f) image(x, y, fa) # e apagando objetos novamente antes de prosseguir. objects(); rm(x, y, f, fa)
Para encerrar esta sessão vajamos mais algumas funcionalidades do R.
# O R pode fazer operação com complexos th <- seq(-pi, pi, len=100) # 1i denota o número complexo i. z <- exp(1i*th) # plotando complexos significa parte imaginária versus real # Isto deve ser um círculo: par(pty="s") plot(z, type="l") # Suponha que desejamos amostrar pontos dentro do círculo de raio unitário. # uma forma simples de fazer isto é tomar números complexos com parte # real e imaginária padrão w <- rnorm(100) + rnorm(100)*1i # ... e para mapear qualquer externo ao círculo no seu recíproco: w <- ifelse(Mod(w) > 1, 1/w, w) # todos os pontos estão dentro do círculo unitário, mas a distribuição # não é uniforme. plot(w, xlim=c(-1,1), ylim=c(-1,1), pch="+",xlab="x", ylab="y") lines(z) # este segundo método usa a distribuição uniforme. # os pontos devem estar melhor distribuídos sobre o círculo w <- sqrt(runif(100))*exp(2*pi*runif(100)*1i) plot(w, xlim=c(-1,1), ylim=c(-1,1), pch="+", xlab="x", ylab="y") lines(z) # apagando os objetos rm(th, w, z) # saindo do R q()Paulo Justiniano Ribeiro Jr