set.seed(123)
numPts = 14 
err <- runif(numPts, -10, 10)
x1 <- runif(numPts,10,100)
y<- 50 + 0.44 * x1 +  err/2 
x1[numPts+1] <- 147 ; y[numPts+1] <- 89  
x1[numPts+2] <- 149 ; y[numPts+2] <- 90  
x1[numPts+3] <- 151 ; y[numPts+3] <- 92  
fitted <- lm(y~x1)
plot(x1,y , xlab="Hours of advertisement" , ylab = "Amount sold" , xlim=c(4,148) , ylim=c(52, 108))
abline(fitted$coef, lwd = 2, col = "blue")
grid(NA, 6, lwd = 2)

rStuRes <- rstudent(fitted)
yHat <- predict(fitted)
res <- y - yHat
plot(yHat, res)
abline(0, 0) 

qqnorm(rStuRes, datax = TRUE, main = "Normal Probability Plot")
qqline(rStuRes, datax = TRUE  )

set.seed(123)
numPts = 20 
err <- runif(numPts, -10, 10)
x1 <- runif(numPts,0,100)
x2 <- runif(numPts,0,100)
y<- 50 + 0.1 * x1 + 0.3 * x2 + err 
# Exercise : Add a "fake outlier" to the observations such that the added point is not an outlier but looks like one in the first plot. (You want a point looks like an outlier in the first one, but in the second plot we verify that it is not an outlier.)
fitted <- lm(y~x1+x2)
# First plot
plot(x2,y)

yHat = predict(fitted)
res= y - yHat
# Second Plot
plot (yHat,res)

# Optional 3rd plot
#library("plot3D")
#library("scatterplot3d")
# sc1 <- scatterplot3d(x1,x2,y, pch=17 , type = 'p', angle = 15 , highlight.3d = T ) 
# sc1$points3d (x1,x2,y, cex=.02, col="blue")

preview the HTML file).

LS0tCnRpdGxlOiAiRmluYWwgRXhhbSAgKHNvbWUgZXhhbXBsZXMpIgpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sKLS0tCgoKYGBge3J9CgpzZXQuc2VlZCgxMjMpCm51bVB0cyA9IDE0IAplcnIgPC0gcnVuaWYobnVtUHRzLCAtMTAsIDEwKQoKeDEgPC0gcnVuaWYobnVtUHRzLDEwLDEwMCkKeTwtIDUwICsgMC40NCAqIHgxICsgIGVyci8yIAoKeDFbbnVtUHRzKzFdIDwtIDE0NyA7IHlbbnVtUHRzKzFdIDwtIDg5ICAKeDFbbnVtUHRzKzJdIDwtIDE0OSA7IHlbbnVtUHRzKzJdIDwtIDkwICAKeDFbbnVtUHRzKzNdIDwtIDE1MSA7IHlbbnVtUHRzKzNdIDwtIDkyICAKCgoKZml0dGVkIDwtIGxtKHl+eDEpCnBsb3QoeDEseSAsIHhsYWI9IkhvdXJzIG9mIGFkdmVydGlzZW1lbnQiICwgeWxhYiA9ICJBbW91bnQgc29sZCIgLCB4bGltPWMoNCwxNDgpICwgeWxpbT1jKDUyLCAxMDgpKQphYmxpbmUoZml0dGVkJGNvZWYsIGx3ZCA9IDIsIGNvbCA9ICJibHVlIikKZ3JpZChOQSwgNiwgbHdkID0gMikKCgpyU3R1UmVzIDwtIHJzdHVkZW50KGZpdHRlZCkKeUhhdCA8LSBwcmVkaWN0KGZpdHRlZCkKcmVzIDwtIHkgLSB5SGF0CnBsb3QoeUhhdCwgcmVzKQphYmxpbmUoMCwgMCkgCgoKCgpgYGAKCgoKCmBgYHtyfQoKCgpxcW5vcm0oclN0dVJlcywgZGF0YXggPSBUUlVFLCBtYWluID0gIk5vcm1hbCBQcm9iYWJpbGl0eSBQbG90IikKcXFsaW5lKHJTdHVSZXMsIGRhdGF4ID0gVFJVRSAgKQoKCgoKYGBgCgoKCmBgYHtyfQpzZXQuc2VlZCgxMjMpCgpudW1QdHMgPSAyMCAKZXJyIDwtIHJ1bmlmKG51bVB0cywgLTEwLCAxMCkKCngxIDwtIHJ1bmlmKG51bVB0cywwLDEwMCkKeDIgPC0gcnVuaWYobnVtUHRzLDAsMTAwKQoKCnk8LSA1MCArIDAuMSAqIHgxICsgMC4zICogeDIgKyBlcnIgCgoKIyBFeGVyY2lzZSA6IEFkZCBhICJmYWtlIG91dGxpZXIiIHRvIHRoZSBvYnNlcnZhdGlvbnMgc3VjaCB0aGF0IHRoZSBhZGRlZCBwb2ludCBpcyBub3QgYW4gb3V0bGllciBidXQgbG9va3MgbGlrZSBvbmUgaW4gdGhlIGZpcnN0IHBsb3QuIChZb3Ugd2FudCBhIHBvaW50IGxvb2tzIGxpa2UgYW4gb3V0bGllciBpbiB0aGUgZmlyc3Qgb25lLCBidXQgaW4gdGhlIHNlY29uZCBwbG90IHdlIHZlcmlmeSB0aGF0IGl0IGlzIG5vdCBhbiBvdXRsaWVyLikKCmZpdHRlZCA8LSBsbSh5fngxK3gyKQoKIyBGaXJzdCBwbG90CnBsb3QoeDIseSkKCnlIYXQgPSBwcmVkaWN0KGZpdHRlZCkKcmVzPSB5IC0geUhhdAoKIyBTZWNvbmQgUGxvdApwbG90ICh5SGF0LHJlcykKCgoKIyBPcHRpb25hbCAzcmQgcGxvdAojbGlicmFyeSgicGxvdDNEIikKI2xpYnJhcnkoInNjYXR0ZXJwbG90M2QiKQoKIyBzYzEgPC0gc2NhdHRlcnBsb3QzZCh4MSx4Mix5LCBwY2g9MTcgLCB0eXBlID0gJ3AnLCBhbmdsZSA9IDE1ICwgaGlnaGxpZ2h0LjNkID0gVCApIAojIHNjMSRwb2ludHMzZCAoeDEseDIseSwgY2V4PS4wMiwgY29sPSJibHVlIikKCgoKCmBgYAoKcHJldmlldyB0aGUgSFRNTCBmaWxlKS4K