Dia 4 - a

Dia 4 - a

Vamos revisar, comentar e alterar um código enviado na lista brasileira do do R para ilustrar alguns aspectos do uso adequado da linguagem.

Aproveitamos o exemplo para discutir a especificação de modelos através do uso de fórmulas no R.

## definindo número de dados  
idados<- 50
##adados<-20000
 
# Equação verdadeira de relacionamento 
## deseja simular de y = beta_0 + beta_1 X1 + beta_2 X2 + beta_3 X1.X2 
# (usada para simular Fase I e gerar Modelo de Regressão)
coef0 <- c(10, 2, -3, 2.3)    ## parâmetros para simular o modelo
 
#Equação alterada
#coefal<-c(10, 6, -3, 2.3)
 
#Fase I
## simulando o valor das covariáveis X1 e X2
x1 <-runif(idados, min=-1, max=1)
x2 <-runif(idados, min=-1, max=1)
## simulando os erros:  
e <-rnorm(idados, mean=0, sd=4)
 
## criando a matriz X 
x <-cbind(1, x1, x2, x1*x2)
## Comentários: 
##     não precisa criar com a coluna x1*x2 
##     pode usar a função model.matrix() para montar a matriz a partir
##         da espeficicação do modelo
X <- model.matrix(~ x1*x2)
X
 
## Sobre formulas no R:
## Notar que os operadores +, * , ^ etc, tem um sentido diferente em formulas
## I()  "força" a operação algébrica entre as variáveis
head(model.matrix(~ x1*x2))
head(model.matrix(~ I(x1*x2)))
head(model.matrix(~ x1+x2))
head(model.matrix(~ I(x1+x2)))
 
 
#invx<-solve(crossprod(x)) #operação (X'X)^-1
da <-data.frame (x1, x2, x1*x2)
 
## colocando as covariáveis num data-frame
da <-data.frame (x1=x1, x1=x2)
## Com.:note que poderi já ter criado aqui para evitar objetos desnecessários:
da <-data.frame(x1=runif(idados, min=-1, max=1), 
                 x2=runif(idados, min=-1, max=1)
               )
 
## simulando os dados
y  <- vector(length=idados)
ii<-1:idados
for (ii in 1:idados) {
  y[ii]<- coef0%*%x[ii,]+e[ii]
}
 
## Com: note que não precisa fazer o loop for() pois o R é linguagem vetorial
##       alem disto poderia criar o y direto no data-frame
da$y <- X %*% coef0 + e
da$y  <-y
 
all.equal(y, da$y)
 
## Com: procure sempre apagar o que não é mais necessário
rm(x1, x2, y)
 
## note a diferença (e semelhancas) entre os modelos
mod   <-lm(y~ x1 + x2 + x1*x2, data=da)
mod
lm(y~ x1 + x2 + I(x1*x2), data=da)
lm(y~ x1 + x2 + x1:x2, data=da)
lm(y~ x1*x2, data=da)
lm(y~ (x1 + x2)^2, data=da)
 
 
sdmod <-sqrt(sum(residuals(mod)^2)/df.residual(mod))
## .. ou direto de summary()
sdmod <- summary(mod)$sigma
 
# Modelo, com a retirada de uma rodada de outliers...
mod  <-lm(y~ x1 + x2 + x1*x2, data=da[abs(residuals(mod))<3*sdmod,])
sdmod<-sqrt(sum(residuals(mod)^2)/df.residual(mod))
 
#Fase II
# Amostra monitorada
xs  <-vector(length=adados)
xs1 <-runif(adados, min=-1, max=1)
xs2 <-runif(adados, min=-1, max=1)
 
es  <-rnorm(adados, mean=0, sd=4)
xs  <-cbind(1, xs1, xs2, xs1*xs2)
 
res <-vector(length=adados)
j   <- 1:adados
res[j] <- 0
ypred <- predict(mod, newdata=data.frame(x1=xs1, x2=xs2))
 
for (j in 1:adados) {
 res[j]<- (coefal%*%xs[j,]+es[j])-ypred[j] 
}
 
 
## Obtendo as estimativas de beta sem usar lm() usando contas matriciais
## beta = (X'X)^(-1) X'y
## operação correta porém  ineficiente e inadequada:
solve(t(X) %*% X) %*% t(X) %*% y
## operação feita de maneira mais adequada:
solve(crossprod(X), crossprod(X,y))