# R script for lecture 7 in STK4900/9900 # Slide 4: Logistic regression ------------------------------------------------- wcgs <- read.table("http://www.uio.no/studier/emner/matnat/math/STK4900/data/wcgs.txt",sep="\t",header=T,na.strings=".") fit <- glm(chd69~age, data=wcgs, family=binomial) summary(fit) a <- predict(fit, type="response", data.frame(age=30)) b <- predict(fit, type="response", data.frame(age=30+1)) (b/(1-b))/(a/(1-a)) exp(fit$coefficients["age"]) a <- predict(fit, type="response", data.frame(age=30)) b <- predict(fit, type="response", data.frame(age=30+10)) (b/(1-b))/(a/(1-a)) exp(fit$coefficients["age"]*10) # Slide 10: OR confidence interval ---------------------------------------------- or.ci <- function(fit){ tmp <- summary(fit)$coef est <- exp(tmp[,1]) lower <- exp(tmp[,1]-1.96*tmp[,2]) upper <- exp(tmp[,1]+1.96*tmp[,2]) return(cbind(est,lower,upper)) } or.ci(fit) # Slide 15: Multiple logistic regression --------------------------------------- fit.mult <- glm(chd69~age+chol+sbp+bmi+smoke, data=wcgs, family=binomial, subset=(chol<600)) summary(fit.mult) or.ci(fit.mult) # Slide 17: Multiple logistic regression (cont) -------------------------------- fit.mult.2 <- glm(chd69~age_10+chol_50+sbp_50+bmi_10+smoke, data=wcgs, family=binomial, subset=(chol<600)) summary(fit.mult.2) or.ci(fit.mult.2) # Slide 18: Multiple logistic regression (cont) -------------------------------- wcgs$behcat <- factor(wcgs$behpat) fit.mult.3 <- glm(chd69~age_10+chol_50+sbp_50+bmi_10+smoke+behcat, data=wcgs, family=binomial, subset=(chol<600)) summary(fit.mult.3) # Slide 28: Model comparison test - Deviance ----------------------------------- anova(fit.mult.2,fit.mult.3,test="Chisq") # Slide 32: Checking linearity - Grouping variables ---------------------------- fit.catage <- glm(chd69~factor(agec), data=wcgs, family=binomial) summary(fit.catage) wcgs$agem <- 39.5*(wcgs$agec==0)+42.9*(wcgs$agec==1)+47.9*(wcgs$agec==2)+52.8*(wcgs$agec==3)+57.3*(wcgs$agec==4) fit.linage <- glm(chd69~agem, data=wcgs,family=binomial) summary(fit.linage) anova(fit.linage, fit.catage,test="Chisq") # Slide 34: Checking linearity - Square/log transform -------------------------- fit <- glm(chd69~age, data=wcgs,family=binomial) fit.a2 <- glm(chd69~age+I(age^2), data=wcgs, family=binomial) anova(fit,fit.a2,test="Chisq") fit.log <- glm(chd69~age+log(age), data=wcgs,family=binomial) anova(fit, fit.log, test="Chisq") # Slide 36: Checking linearity - GAM ------------------------------------------- library(gam) fit.gam <- gam(chd69~s(age), data=wcgs, family=binomial) plot(fit.gam, se=TRUE) anova(fit, fit.gam, test="Chisq")