# Example usage:

# >fit<- lm(swiss.fertility ~ swiss.x[,"Education])

# >plotresiduals(fit)

# The Functions (should I do a mime attachment next time?):

studreshii <- function(fit)

{

if(class(fit) != "lm")

stop("Data must be from lm")

thii <- lm.influence(fit)$hat

ei <- residuals(fit)

s <- sqrt(var(residuals(fit)))

eip <- ei/(s * sqrt(1 - thii))

tstudres <- eip * sqrt((fit$df - 1)/(fit$df - thii^2))

result <- data.frame(hii = thii, studres = tstudres)

class(result) <- "studreshii"

result

}

print.studreshii <- function(x)

{

plot(x$hii, x$studres, main = "Influential Observation Analysis",

xlab =

"Hii", ylab = "Studentized Residuals")

}

plotresiduals <- function(fit)

{

if(class(fit) != "lm")

stop("Data must be from lm") #calculate hii

hii <- lm.influence(fit)$hat

Ei <- residuals(fit) #calculate Studentized Residuals

s <- sqrt(var(Ei))

Eip <- Ei/(s * sqrt(1 - hii))

studres <- Eip * sqrt((fit$df - 1)/(fit$df - hii^2))

old.par <- par(mfrow = c(2, 2))

on.exit(par(old.par)) #scatter plot residuals

plot(predict(fit), Ei, main = "Residuals", xlab = "") #QQnormal plot

qqnorm(Ei)

qqline(Ei)

title("Normal QQ-plot of Residuals")

#distribution of residuals against normal curve

hist(Ei, prob = T, xlab = "residuals", ylab = "")

a <- seq(min(Ei), max(Ei), length = 100)

lines(a, dnorm(a, mean = mean(Ei), sd = s))

title("Residuals and Normal Fit")

#Studentized versus hii scaterplot

plot(hii, studres, main = "Influential Observation Analysis",

xlab = "Hii", ylab = "Studentized Residuals")

}

create.menu.lmfit<- function() {

guiCreate("MenuItem",

Name = "SPlusMenuBar$Zinn",

Type = "Menu",

MenuItemText = "&Zinn",

Index = 12,

OverWrite=F)

guiCreate("MenuItem",

Name="SPlusMenuBar$Zinn$Lmfit" ,

Type="MenuItem",

Action="Function",

Command="plotresiduals",

MenuItemText="&Residual analysis")

invisible()

}

create.menu.lmfit()

create.menu.lmfit()

create.toolbar.zinn <- function(){

guiCreate("Toolbar",Name = "Zinn")

guiCreate("ToolbarButton",

Name = "Zinn$Lmfit",

Type = "Button",

Action = "Function",

Command = "plotresiduals",

TipText = "Plot residuals information", ShowDialogOnRun=T)

invisible()

}

create.toolbar.zinn()

#guiRemove("MenuItem",Name="SPlusMenuBar$Zinn$Lmfit")

#guiRemove("MenuItem",Name="SPlusMenuBar$Zinn")

#guiRemove("ToolbarButton",Name="Zinn$Lmfit")

#guiRemove("Toolbar",Name="Zinn")