1 Uma primeira sessão com o R

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.

  1. inicie o R em seu computador.
  2. voce verá uma janela de comandos com o símbolo $>$.
    Este é o prompt do R indicando que o programa está pronto para receber comandos.
  3. a seguir digite (ou ''recorte e cole'') os comandos mostrados abaixo.
    No restante deste texto vamos seguir as seguintes convenções.

# 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