ESERCITAZIONI SOFTWARE R TUTORATO 1 Comandi principali #PER SCRIVERE COMMENTI# help() help("if") ?mean help.search("mean") example(mean) demo(graphics) #ASSEGNAZIONE DI VALORI# x<-1 x y<-3 y x*y #STRINGA DI VALORI# d<-c(1,2,3,4) d is.vector(d) f<-vector(length=4, mode="numeric") f k<-rep(2,6) k h<-seq(2,6,0.5) h assign("y", c(2,7,4,1)) y ls() #INIZIARE UNA NUOVA SESSIONE DI LAVORO# rm(list=ls()) ls() #MATRICI# x<-4 x y<-c(2,7,4,1) y x*y y>3 X<-matrix(1:30,5,6) X X[,j] X[i,] Y<-matrix(1:30,5,6,byrow=TRUE) Y dim(Y) Z<-array(dim=c(2,5)) Z Z<-array(dim=c(2,5),1:10) Z t(X) t(X)%*%Y #ACCEDERE AD ELEMENTI DI VETTORI# y[4] yy<-y[c(1,3)] yy X[2,1] X[3,] X[,1] #INFORMAZIONI SUI VETTORI# length(y) max(y) min(y) sum(y) prod(y) mean(y) range(y) #FREQUENZE# table(X) table(X)/length(X) table(X)/length(X)*100 Caso Orange juice (dataset presente in R) library(bayesm) data(orangeJuice) ?orangeJuice logvend <- orangeJuice$yx$logmove brand <- orangeJuice$yx$brand summary(logvend) #GRAFICI# hist(logvend, main="istogramma logvend", col="red") boxplot(logvend) boxplot(logvend ~ brand)#BOXPLOT PER OGNI MARCA# #STANDARDIZZARE# z <-(logvend-mean(logvend))/sd(logvend) mean(z) sd(z) #con i dati originali senza log# vend <- exp(logvend) sd(vend) sd(logvend) TUTORATO 2 Caso BigMac2003( dataset presente in R) library(alr3) data(BigMac2003) BigMac2003 ?BigMac2003 boxplot(BigMac2003$BigMac, BigMac2003$Bread, BigMac2003$Rice,main="boxplot BigMac, Bread, Rice") #PER CALCOLARE COVARIANZA E CORRELAZIONE# cov(BigMac2003$FoodIndex, BigMac2003$BigMac) cor(BigMac2003$FoodIndex, BigMac2003$BigMac) #PER LO SCATTERPLOT# plot(BigMac2003$FoodIndex, BigMac2003$BigMac,main="scatterplot foodIndexBigMac") #TOGLIERE VARIABILE QUALITATIVA CITY# xx <- BigMac2003[,-1] xx cor(xx) pairs(xx,main="scatterplot matrice di correlazione") #RIDURRE IL GRAFICO A POCHE VARIABILI# xx.red <- cbind(xx$BigMac, xx$Bread, xx$Rice, xx$FoodIndex, xx$Apt) cor(xx.red) pairs(xx.red,main="corr BigMac,Bread,Rice,FoodIndex,Apt", labels=c("BigMac", "Bread", "Rice", "Index", "Apt")) #MODELLO DI REGRESSIONE LINEARE# fit<-lm(BigMac2003$FoodIndex ~ BigMac2003$Apt) summary(fit) plot(BigMac2003$Apt, BigMac2003$FoodIndex, xlab="Canone affitto", ylab="Indice") abline(fit)#PER AGGIUNGERE LA RETTA DI REGRESSIONE# #PER VALUTARE I RESIDUI DELLA REGRESSIONE E LA LORO NORMALITÀ# residual=resid(fit) residual plot(residual, main="Grafico dei residui", ylab=" ", xlab="Città") qqnorm(residual, main="Q-Q Plot dei residui") qqline(residual) Caso 1 capitolo 1 del libro (dati libro_cap1_1) #IMPORTAZIONE DEI DATI# x <- read.table(file.choose(), col.names=c("imp", "prezzi", "pubbl")) import <- x$imp prezzi <- x$prezzi pubbl <- x$pubbl boxplot(x, main="Variazioni relative di importazioni, prezzi, pubblicità") boxplot(import, prezzi, pubbl, main="Variazioni relative di importazioni, prezzi, pubblicità") summary(import) summary(prezzi) summary(pubbl) hist(import, main="Istogramma variazioni relative delle importazioni", xlab=" ", ylab=" ",prob=TRUE) hist(prezzi, main="Istogramma variazioni relative dei prezzi", xlab=" ", ylab=" ",probability=TRUE) hist(pubbl, main="Istogramma variazioni relative delle spese pubblicitarie", xlab=" ", ylab=" ",probability=TRUE) #MATRICE DI CORRELAZIONE E SCATTERPLOT# pairs(x,labels=c("Import", "Prezzi", "Pubblicità")) cor(x) #MODELLO DI REGRESSIONE LINEARE# fit <- lm(import ~ prezzi) summary(fit) plot(prezzi,import,xlab="Variazioni relative prezzi",ylab="Variazioni relative importazioni", main="Stima retta di regressione") abline(fit) #DIAGNOSTICA PER LA BONTÀ DEL MODELLO# plot(resid(fit), xlab="i", ylab="Residui") abline(c(0,0),col=2,lwd=2) #NORMALITÀ DEI RESIDUI# qqnorm(resid(fit),main="Q-Q plot dei residui") qqline(resid(fit)) #NON CORRELAZIONE DEI RESIDUI CON I VALORI STIMATI Y# plot(fitted(fit),resid(fit), main="Valori di y stimati vs. residui stimati",xlab="Stima di y",ylab="Residui") #OMOSCHEDASTICITÀ# plot(prezzi,resid(fit), main="Prezzi vs. residui stimati",xlab="Prezzi",ylab="Residui") abline(c(0,0),col=2) #DISTANZA DI COOK# plot(import ~ prezzi, cex=10*sqrt(cooks.distance(fit)), main="Dati influenti nella regressione di IMPORT su PREZZI") #TABELLA ANOVA# fit_aov <- aov(import ~ prezzi) summary(fit_aov) #PREVISIONE( 3 SCENARI DEL LIBRO)# x.mean <- mean(import) pred.fit1 <- predict(fit, newdata=data.frame(prezzi=-0.001),interval="pred") pred.fit1 pred.fit2 <- predict(fit, newdata=data.frame(prezzi=-0.097),interval="pred") pred.fit2 pred.fit3 <- predict(fit, newdata=data.frame(prezzi=0.061),interval="pred") pred.fit3 #INTERVALLI DI PREVISIONE# x.mean <- mean(prezzi) #CREO UN VETTORE DI VALORI CHE CONTENGA IL VALORE MEDIA# zz <- c(-3,-2.5,-2,-1.5,-1,-0.9,-0.5,-0.4,-0.3,-0.2,-0.1,-0.097,-0.01,0.001,0,0.001,0.01,x.mean,0.015,0.02,0.05,0.06,0.07,0.1,0.2,0.3,0.5,0.8,1,1.5,2, 2.5,3,3.5) pred <- predict(fit, newdata=data.frame(prezzi=zz),interval="pred") pred #GRAFICO DELLA PREVISIONE# plot(zz,pred[,1],type="l",xlim=c(-3.2,3.7),ylim=c(-4.1,3.6),main="Previzioni e intervallo di confidenza al 95%",xlab="x",ylab="Previsione") lines(zz,pred[,2],type="l",lty=2,col=2,lwd=2) lines(zz,pred[,3],type="l",lty=2,col=2,lwd=2) abline(v=x.mean,lty=3) #REGRESSIONE MULTIPLA: IMPORT=F(PREZZI,PUBBLICITÀ)# fitmult <- lm(import ~ prezzi + pubbl) fitmult1 <- update(fit, . ~ . + pubbl)#COMANDO ALTERNATIVO# summary(fitmult) #ANOVA# fitmult_aov <- anova(fitmult) fitmult_aov #CALCOLO DEL FATTORE DI INCREMENTO DELLA VARIANZA# library(car) vif(fitmult) TUTORATO 3 Caso 2 capitolo 1 del libro (dati indmkt) library(car) xx <- read.table(file.choose(), col.names=c("prod", "serv", "prezzo", "imgn", "veloc", "acq")) xx y <- xx$acq x1 <- xx$prod x2 <- xx$serv x3 <- xx$prezzo x4 <- xx$imgn x5 <- xx$veloc # SCATTERPLOT# pairs(xx,labels=c("prod", "serv", "prezzo", "imgn", "veloc", "acq")) cor(xx) #MODELLO REGRESSIONE MULTIPLA# fit_caso2 <- lm( y ~ x1 + x2 + x3 + x4 + x5 ) summary(fit_caso2) anova(fit_caso2) #CALCOLO DEL FATTORE DI INCREMENTO DELLA VARIANZA# vif(fit_caso2) # STIMA DEL MODELLO RIDOTTO #(senza intercetta) fit1_caso2 <- lm(y ~ x1 + x2 + x3 -1 ) # summary(fit1_caso2) fit1_caso2 <- update(fit_caso2, . ~.-1 - x4 - x5) # comando alternativo# summary(fit1_caso2) #NORMALITÀ DEI RESIDUI# qqnorm(rstandard(fit1_caso2),main="Q-Q plot dei residui") qqline(rstandard(fit1_caso2)) # NON CORRELAZIONE DEI RESIDUI CON I VALORI STIMATI Y # plot(fitted(fit1_caso2),rstandard(fit1_caso2), main="Valori di y stimati vs. residui stimati",xlab="Stima di y",ylab="Residui") # NON CORRELAZIONE DEI RESIDUI CON I PREDITTORI# par(mfrow=c(2,2)) plot(x1,resid(fit1_caso2), main="Qualità prodotto vs. residui stimati",xlab="Qualità prodotto",ylab="Residui") abline(c(0,0),col=2) plot(x2,resid(fit1_caso2), main="Qualità servizio vs. residui stimati",xlab="Qualità servizio",ylab="Residui") abline(c(0,0),col=2) plot(x3,resid(fit1_caso2), main="Prezzo vs. residui stimati",xlab="Prezzo",ylab="Residui") abline(c(0,0),col=2) # PREVISIONI (4 SCENARI DEL LIBRO)# pred <- predict(fit1_caso2, newdata=xx, interval="pred") plot(pred[,"fit"], ylim=c(18,74),main="Valori osservati, stimati e intervalli di confidenza",xlab=" ",ylab=" ") points(y,col=2) lines(pred[,"lwr"], lty=2, type="b", col=4) lines(pred[,"upr"], lty=2, type="b", col=4) TUTORATO 4 Caso space shuttle (dati spacshu) spacshu <- read.table(file.choose(), col.names=c("temp", "damage")) #PER DISTANZIARE I VALORI DI DAMAGE# plot(jitter(damage, factor=0.2) ~ temp, ylab="damage",data=spacshu,main="Dati osservati") Regressione logistica spacshu.bin.glm <- glm(damage ~ temp, data=spacshu, family="binomial") summary(spacshu.bin.glm) anova(spacshu.bin.glm, test="Chi") #PREVISIONE# library(lattice) pred.disaster <- predict(spacshu.bin.glm, data.frame(temp=31), type="response", se.fit=T) spacshu.pred <-predict(spacshu.bin.glm, data.frame(temp=30:85), type="response", se.fit=T) #GRAFICO DELLA PREVISIONE# plot(jitter(damage, factor=0.2) ~ temp, data=spacshu,ylab="proportion damaged", main="Stima della probabilità di malfunzionamento di un o-ring",xlim=c(30,85), ylim=c(-.1,1.5)) #PER INSERIRE GLI INTERVALLI DI CONFIDENZA# lines(x=30:85,y=spacshu.pred$fit,lty=trellis.par.get("superpose.line")$lty[1],co l=trellis.par.get("superpose.line")$col[1]) lines(x=30:85,y=spacshu.pred$fit+2*spacshu.pred$se.fit,lty=trellis.par.get("supe rpose.line")$lty[2],col=trellis.par.get("superpose.line")$col[2]) lines(x=30:85,y=spacshu.pred$fit2*spacshu.pred$se.fit,lty=trellis.par.get("super pose.line")$lty[2],col=trellis.par.get("superpose.line")$col[2]) TUTORATO 5 Caso pazienti cardiopatici Los Angeles (dati chapman) x = read.table(file.choose(), header=TRUE) ## ## ## ## ## ## ## ## ## ## ## Variabili nel dataset Ag = età in anni S = Pressione sistolica (mm di mercurio) D = Pressione diastolica (mm di mercurio) Ch = Colesterolo (mg per DL) H = Altezza (inches --> 1 inch = 2.5 cm) W = Peso (libbre --> 1 libbra = 450 g) CNT = Attacco cardiaco CNT = 1 --> attacco cardiaco CNT = 0 --> no attacco cardiaco 200 osservazioni con 26 attacchi cardiaci #RINOMINO IN R LE VARIABILI# Ag = x$Ag S = x$S D = x$D Ch = x$Ch H = x$H W = x$W Cnt = x$Cnt sum(Cnt) #CORRELAZIONE NON CONSIDERANDO LA PRIMA COLONNA# pairs(x[,2:8]) #DISTANZIO I VALORI DI Cnt E NE VALUTO LA RELAZIONE CON Ch,W E Ag# jit.cnt = jitter(Cnt, factor=0.2) plot(Ch, jit.cnt, main="Scatterplot Attacco cardiaco vs Colesterolo", xlab="Colesterolo",lwd=2,col=2) abline(v=240,lty=3,lwd=2) plot(W, jit.cnt, main="Scatterplot Attacco cardiaco vs Peso", xlab="Peso (in libbre)",lwd=2,col=2) plot(Ag, jit.cnt, main="Scatterplot Attacco cardiaco vs Età", xlab="Età",lwd=2,col=2) #MODELLO DI REGRESSIONE LOGISTICA# p=prob(attacco cardiaco) # logit(p)=log(p/(1-p))=beta_0 + beta_1*Ag + beta_2*S + beta_3*D + beta_4*Ch + beta_5*H + beta_6*W# fit <- glm(Cnt ~ Ag + S + D + Ch + H + W, family="binomial", data=x) summary(fit) #PREVISIONI# logit.p = predict(fit, newdata=data.frame(Ag=60, S=140, D=100, Ch=250, H=72, W=155.55), se.fit=TRUE) logit.p # MODELLO CON LA PREVISIONE# hat.p = exp(logit.p$fit)/(1+exp(logit.p$fit)) hat.p #INTERVALLI DI CONFIDENZA PER LA PREVISIONE# lwr = hat.p - 1.96*logit.p$se.fit upr = hat.p + 1.96*logit.p$se.fit lwr upr # MODELLO RIDOTTO CON SOLI: ETÀ E PESO# fit1 = glm(Cnt ~ Ag + W, family="binomial", data=x) summary(fit1) anova(fit1, test="Chi") #IL TEST CHI-QUADRO PER LA D# chi.obs<-154.55-138.77 chi.obs pchisq(chi.obs,df=2,lower.tail=FALSE) CLUSTERING #esempio numerico con osservazioni 1,2,3,4,5# d <- matrix(c(0,9,3,6,11, 9,0,7,5,10, 3,7,0,9,2, 6,5,9,0,8, 11,10,2,8,0), nrow=5, ncol=5, byrow=TRUE) #trasformazione della matrice d in matrice di distanze# dd <- as.dist(d) dd #cluster con 3 diversi metodi# xs <- hclust(dd, method="single") plot(xs, main="Dendrogramma (legame singolo)") xc <- hclust(dd, method="complete") plot(xc, main="Dendrogramma (legame completo)") xm <- hclust(dd, method="average") plot(xm, main="Dendrogramma (legame medio)") Caso arresti nei 50 stati americani (dati presenti in R) data(USArrests) ?USArrests x<-USArrests x #CLUSTER CON METODO DI WARD# hc <- hclust(dist(USArrests), "ward") plot(hc) #RIDUZIONE DEL NUMERO DI CLUSTER# rect.hclust(hc, k=3, border="red") rect.hclust(hc, k=7, border="red") #CLUSTER CON IL METODO DELLA K-MEANS# library(vegan) km <- kmeans(USArrests, centers=3, nstart=25,iter.max=10, algorithm="MacQueen") km #CRITERIO DI CALINSKY# km1 <- cascadeKM(USArrests, inf.gr=2, sup.gr=6, iter=100, criterion="calinski") km1 plot(km1,grpmts.plot=TRUE)