Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Tema 3 RSTUDIO
Tema 3 RSTUDIO
summary(liver)
liver$gender=as.factor(liver$gender)
pairs(liver)
pairs(liver[,c(1:5,9)])
#Vamos a empezar ajustando un modelo de regresión con estas 5 primeras covariables, para
#examinar residuos y ver si la relacion es lineal:
lm.1=lm(survival~blood+prognostic+enzyme+liver+age+gender,data=liver)
summary(lm.1)
plot(lm.1)
#No parece homocedasticidad (grafico 1), parece problemas con los residuos en la de
#normalidad. En la siguiente, parece que hay una observación muy influyente: parece haber
#algun valor anomalo, gran leverage para dos valores y un valor de la distancia cook grande. Se
#observa en el ultimo grafico que parece que la relacion puede ser algo cuadrática y varianza
#no constante.
hist(liver$survival)
#Para hacerlo simetrico, consideramos log. Para estabilizar estos problemas, probamos con la
#transformacion:
log.surv=log(liver$survival)
lm.2=lm(log.surv~blood+prognostic+enzyme+liver+age+gender,data=liver)
plot(lm.2)
#Se ha arreglado notablemente. Ya no tenemos los residuos influyentes del de normalidad. Las
#cotas del siguiente tampoco estan.
liver=cbind(liver, log.surv)
colnames(liver)[10]="log.surv"
pairs(liver[,c(1:5,10)])
#Parece que la varianza se estabiliza algo y que los residuos se hacen mas normales.
library(leaps)
#Cuidado cuando trabajamos con factores. En este caso hay que usar la funcion model.matrix
#reg.fit.selec=regsubsets(x=liver[,1:6],y=liver$log.surv)
reg.summary=summary(reg.fit.selec)
summary(reg.fit.selec)
#Aqui se nos muestran cuales son los mejores modelos de dimension 1,2,3,...
#Por ej, el mejor modelo de dimension 1 es el que contiene enzyme, de dos seria enzyme y
#prognostic,... Los que pone asterisco son los que se añadirian
names(reg.summary)
#Estadisticos R^2:
reg.summary$rsq
#Estadistico R^2 ajustado. Me devuelve los R^2 ajustados para cuando solo me quedo con 1:
#enzima, para cuando me quedo con 2: pronostico y enzima… El numero es la variabilidad
#explicada.
reg.summary$adjr2
#Segun el criterio del R^2 ajustado, el mejor pronostico seria el de 4 variables. Podria
#quedarme con varios modelos: entre 3, 4 y 5 variables.
par(mfrow=c(2,2))
which.max(reg.summary$adjr2)
points(4,reg.summary$adjr2[4], col="red",cex=2,pch=20)
mod.sele=lm(log.surv~ blood+prognostic+enzyme+age,data=liver)
summary(mod.sele)
#Grafico cp: el que se acerque a la linea tiene menor sesgo. Nos interesa menos error.
#Insesgado es mejor pero peudo elegir mas sesgados con menor error cuadratico medio. Se ve
#que en el 5 tengo menor error cuadratico medio pero es mas sesgado. Elegimos siempre
#menor error cuadratico medio. Si se llevan poco elegimos el mas insesgado
which.min(reg.summary$cp )
points(4,reg.summary$cp [4],col="red",cex=2,pch=20)
which.min(reg.summary$bic)
points(3,reg.summary$bic [3],col="red",cex=2,pch=20)
reg.summary$bic
[1] -22.11697 -46.79551 -60.48937 -59.14484 -56.16011 -52.17482
#El modelo con 3 covariables tiene mayor bic (en valor absoluto). No incluye edad
plot(reg.fit.selec,scale="adjr2")
reg.summary$adjr2
plot(reg.fit.selec,scale="bic")
reg.summary$bic
#El AIC y el BIC tambien aparecen implementados por defecto en R, solo que tendriamos que
#calcularlos para cada modelo:
AIC(lm(log.surv~enzyme,data=liver)) #51
AIC(lm(log.surv~prognostic+enzyme,data=liver)) #24
AIC(lm(log.surv~ blood+prognostic+enzyme,data=liver)) #9
#El modelo con 3 covariables tiene menor BIC (en valor absoluto)
install.packages("DAAG")
library(DAAG)
#Para los mejores modelos seleccionados, de 1, 2, 3 ... covariables (los que me seleccionaba
#regsubset), calculamos PRESS
press(lm(log.surv~ enzyme,data=liver)) #8
press(lm(log.surv~ prognostic+enzyme,data=liver)) #5
press(lm(log.surv~ blood+prognostic+enzyme+liver,data=liver)) #4
press(lm(log.surv~ blood+prognostic+enzyme+liver+age,data=liver)) #4
x=model.matrix(~blood+prognostic+enzyme+liver+age+gender+alch.cons, data=liver)
reg.fit.selec=regsubsets(y=log.surv,x=x[,-1], data=liver)
reg.summary=summary(reg.fit.selec)
summary(reg.fit.selec)
reg.summary$cp
#Usando el criterio Cp, tendriamos que seleccionar las variables: blood, prognostic, enzyme,
#alc.heavy, alch.consNone y gender
reg.summary$bic
#Usando el criterio BIC, tendriamos que seleccionar las variables: blood, prognostic, enzyme,
#alc.heavy, alch.consNone.
reg.summary$bic
reg.summary$adjr2
#Usando el criterio R2 ajustado, tendriamos que seleccionar las variables: blood, prognostic,
#enzyme, alc.heavy, alch.consNone, gender y age.
library(DAAG)
press(lm(log.surv~ enzyme,data=liver)) #8
press(lm(log.surv~ prognostic+enzyme,data=liver)) #5
#Vamos a analizar el ajuste con el modelo mas parsimonioso, es decir el que incluye
#blood+prognostic+enzyme+alch.cons, y el modelo que elegiría por ejemplo Cp que contendría
#6 cov: blood+prognostic+enzyme+alch.cons+gender
lm.4=lm(log.surv~ blood+prognostic+enzyme+alch.cons,data=liver)
lm.5=lm(log.surv~ blood+prognostic+enzyme+alch.cons+gender,data=liver)
summary(lm.4)
summary(lm.5)
#El consumo de alcohol es un factor: me sale heavy, mode y none. No puedo poner 1, 2 y 3
#porque no es numerica. Si ajusto un modelo con esa variable y hago summary me salen dos
#coeficientes: uno de consumo moderado y uno de sin alcohol. Como es una variable con 3
#factores, saca dos dummies (la 3ª se explica con las otras dos). Lo hace por orden alfabetico.
#Se restaran los valores de alch.mod y alch.None (bajara la recta porque es negativo). Se
#obtiene un hiperplano para consumo elevado de alcohol y luego se sumara o restara la
#cantidad de alcohol moderado o no alcohol, según al grupo al que pertenezca. Veo el
#coeficiente de consumo moderado y no consumo frente a consumo elevado.
plot(lm.4)
plot(lm.5)
#viendo los graficos de los residuos, el ajuste es muy parecido en ambos modelos, en cuanto a
#bondad residual. No hay mucha mejoria en las posibles observaciones influyentes incluyendo
#blood o no incluyendola. Por otro gender no parece significativa. Si parece que el paciente del
#17 tiene valores influyentes. No parece haber heterocedasticidad. Desde este punto de vista
#nos quedamos con el 4 porque parece que en el otro hay valores mas influyentes.
#Si comparamos los modelos usando una comparacion con la F para comparar las sumas
#residuales con uno y otro modelo. Hay diferencia de 1 grado de libertad
anova(lm.4,lm.5)
#Nos quedamos con el modelo 4, ya que el p-valor es grande, lo que quiere decir que se puede
#asumir que el beta asociado a gender es 0. Sale 2.19 en el test de la F: probabilidad de 0.14 de
#ser compatible. El p-valor no es significativo=> los dos modelos explican parecido=> me
#quedo con el de menor variables (menos grados de libertad).
library(olsrr)
library(car)
n=length(liver$log.surv)
stud.del.resids=rstudent(lm.4)
stud.del.resids
range(stud.del.resids)
#Miramos si estos residuos eliminados estudentizados son mayores que, para un alpa=0.01
qt(1-0.01/(2*n),df= n-4-1) #4
#Los valores maximo y minimos no son mayores en valor absoluto del correspondiente cuantil,
#aunque el residuo de la observacion 17 se queda con un valor muy grande.
ols_plot_resid_stud_fit(lm.4)
2*4/n
ols_leverage(lm.4)
dffits(lm.4) #dffits.
ols_plot_cooksd_chart(lm.4)
qf(0.2,df1=4,df2=n-4)
influence(lm.4)
#Panel de graficos para analizar las diferentes cuestiones que hemos ido comentando:
ols_plot_diagnostics(lm.4)
ols_coll_diag(lm.4)
x=model.matrix(~blood+prognostic+enzyme+liver+age+gender+alch.cons, data=liver)
reg.summary.forward=summary(reg.fit.selec.forward)
summary(reg.fit.selec.forward)
names(reg.summary.forward)
#Estadisticos R^2:
reg.summary.forward$rsq
reg.summary.forward$adjr2
#Estadisticos Cp ajustado:
reg.summary.forward$cp
reg.summary.forward$bic
reg.summary.back=summary(reg.fit.selec.back)
summary(reg.fit.selec.back)
names(reg.summary.back)
#Estadisticos R^2:
reg.summary.back$rsq
reg.summary.back$adjr2
#Estadisticos Cp ajustado:
reg.summary.back$cp
reg.summary.back$bic
reg.summary.seq=summary(reg.fit.selec.seq)
summary(reg.fit.selec.seq)
#Estadisticos R^2:
reg.summary.seq$rsq
reg.summary.seq$adjr2
#Estadisticos Cp ajustado:
reg.summary.seq$cp
reg.summary.seq$bic
#Notar que en este caso no se llega a seleccionar el mejor modelo al que llegaba bic por
busqueda exhaustiva o por stepwise (hacia atras y hacia adelante)
#Hemos considerado todo el rato alcohol como dummy. Ahora vamos a considerarla
#como factor
setwd("~/Dropbox/docencia/ModelosPrediccion/Tema3/datos")
#liver <-
#read.delim("~/Dropbox/docencia/ModelosPrediccion/Tema2/datos/UnidadQuirur.txt",
#header=FALSE)
#colnames(liver)=c("blood", "prognostic",
#"enzyme","liver","age","gender","alc.mod","alc.heavy","survival")
setwd("C:/Users/maria/Dropbox/docencia/ModelosPrediccion/Tema3/datos")
summary(liver)
liver$gender=as.factor(liver$gender)
names(liver)
#alc.mod and alc.heavy son dummys de la misma variable, vamos a redefinir un factor:
indi.none=(1-liver$alc.heavy-liver$alc.mod)
indi.mod=liver$alc.mod
indi.heavy=liver$alc.heavy
aux=cbind(indi.none,indi.mod,indi.heavy)
colSums(aux)
rowSums(aux)
alch.cons=1*indi.none+2*indi.mod+3*indi.heavy
alch.cons
table(alch.cons)
alch.cons=factor(alch.cons,levels=c(1,2,3),labels=c("None","Mod","Heav"))
liver.new=data.frame(liver[,c(1:6)],alch.cons,liver$survival)
names(liver.new)[8]="survival"
write.csv(liver.new,file="liver.csv")
library(ISLR)
fix(Hitters)
#Queremos predecir el salario de los jugadores de baloncesto
names(Hitters)
dim(Hitters)
sum(is.na(Hitters$Salary))
Hitters=na.omit(Hitters)
dim(Hitters)
sum(is.na(Hitters))
library(leaps)
regfit.full=regsubsets(log(Salary)~.,Hitters)
summary(regfit.full)
#En este caso hemos probado los diferentes modelos hasta un numero maximo de 8
#covariables, incrementamos este numero hasta 19:
regfit.full=regsubsets(log(Salary)~.,Hitters,nvmax=19)
summary(regfit.full)
reg.summary.full=summary(regfit.full)
reg.summary.full$adjr2
par(mfrow=c(2,2))
which.max(reg.summary.full$adjr2)
points(13,reg.summary.full$adjr2[11], col="red",cex=2,pch=20)
points(9,reg.summary.full$cp[10],col="red",cex=2,pch=20)
abline(1,1)
which.min(reg.summary.full$bic)
points(3,reg.summary.full$bic[6],col="red",cex=2,pch=20)
regfit.forw=regsubsets(log(Salary)~.,Hitters,nvmax=19,method="forward")
summary(regfit.forw)
reg.summary.forw=summary(regfit.forw)
reg.summary.forw$adjr2
reg.summary.forw$bic
which.max(reg.summary.forw$adjr2) #13
which.min(reg.summary.forw$bic) #4
which.min(reg.summary.forw$cp) #9
regfit.bac=regsubsets(log(Salary)~.,Hitters,nvmax=19,method="backward")
summary(regfit.bac)
reg.summary.bac=summary(regfit.bac)
reg.summary.bac$adjr2
which.max(reg.summary.bac$adjr2) #13
which.min(reg.summary.bac$bic) #3
which.min(reg.summary.forw$cp) #9
names(coef(regfit.bac,3))
names(coef(regfit.full,3))
fit.3=lm(log(Salary)~Hits+Walks+Years,data=Hitters)
plot(fit.3)
summary(fit.3)
fit.9=lm(log(Salary)~AtBat+Hits+Walks+Years+CRuns+CWalks+League+Division+PutOuts,data=
Hitters)
summary(fit.9)
plot(fit.9)
library(DAAG)
#Para el modelo que le digo, parte el data.set en train y predice los los del test. Lo hace varias
#veces
library(lattice)
cv.lm(data=Hitters,form.lm=fit.3,seed=231)
cv.lm(data=Hitters,form.lm=fit.9,seed=191)