Esercitazione
Transcript
Esercitazione
22/01/2016 Prova scritta del 7 marzo 2014 Un campione di 100 componenti è sottoposto alla prova di durata per 500 ore e i tempi di insuccesso dei 12 componenti che si sono guastati durante il test sono i seguenti: 6, 21, 50, 84, 95, 130, 205, 260, 270, 370, 440 e 480 ore. a) Costruire un modello teorico che descriva il tempo di vita del componente. b) Sottoporlo a verifica statistica(…). c) Calcolare il tempo di vita medio teorico in base al modello scelto e confrontarlo con il tempo di vita campionario. d) Determinare la mediana teorica e confrontarla con quella empirica valutata sui dati. Analisi descrittiva del campione > h<-hist(dati) > str(h) List of 6 $ breaks : num [1:6] 0 100 200 300 400 500 $ counts : int [1:5] 5 1 3 1 2 $ density : num [1:5] 0.004167 0.000833 0.0025 0.000833 0.001667 $ mids : num [1:5] 50 150 250 350 450 $ xname : chr "dati" $ equidist: logi TRUE - attr(*, "class")= chr "histogram" Dall’istogramma si evince un andamento esponenziale. Per salvare i grafici in PDF 1 22/01/2016 Se sovrapponiamo la linea della densità, potrebbe andar bene anche un modello di Weibull. > h<-hist(dati,freq=F) > lines(density(dati),col='red',lwd=3) Pertanto effettuiamo i PPP per stabilire quale modello usare. Per poter mettere i grafici su una stessa finestra > par(mfrow=c(1,3)) > qqnorm(dati) Per verificare l’andamento esponenziale > x<-sort(dati) > index<-seq(1,12,1) > cdf<-(index-0.3)/12.4 > z<-log(1/(1-cdf)) > plot(x,z,type='p',xlab='Dati',ylab='Trasf.log.cdf',main='Prob.plotting + esponenziale') > Per verificare l’andamento di Weibull 2 22/01/2016 > x<-log(sort(dati)) > z<-log(log(1/(1-cdf))) > plot(x,z,type='p',xlab='Log Dati',ylab='Log log cdf',main='Probability + plotting paper Weibull') > La distribuzione di Weibull è quella che meglio fitta i dati. In questo momento non abbiamo gli strumenti per stabi lire quale distribuzione si avvicina maggiormente a quella teorica. Potremmo usare una legge lognormale? > par(mfrow=c(1,1)) > qqnorm(log(dati)) > Avendo stabilito che la legge da usare per la stima è quella di Weibull, usiamo il metodo massima verosimiglianza > library('MASS') > stima<-fitdistr(dati,"weibull") Errore in fitdistr(dati, "weibull") : optimization failed > REGRESSIONE 3 22/01/2016 > x<-log(sort(dati)) > result<-lm(z ~ x) > result Call: lm(formula = z ~ x) > x<-log(sort(dati)) > z<-log(log(1/(1-cdf))) > plot(x,z,type='p',xlab='Log Dati',ylab='Log log cdf', + main='Probability plotting paper Weibull') > abline(lm(z ~ x)) Coefficients: (Intercept) x -4.5465 0.8419 > m=0.8419 > b=exp(4.5465/m) > ks.test(dati,"pweibull",0.84195,exp(4.5465/0.84195)) One-sample Kolmogorov-Smirnov test data: dati D = 0.1468, p-value = 0.9253 alternative hypothesis: two-sided > ks.test(dati,"pexp",1/mean(dati)) One-sample Kolmogorov-Smirnov test data: dati D = 0.1425, p-value = 0.9396 alternative hypothesis: two-sided 4 22/01/2016 Calcolare il tempo di vita medio (mediano) teorico in base al modello scelto e confrontarlo con il tempo di vita medio (mediano) campionario. > summary(dati) Min. 1st Qu. Median 6.0 75.5 167.5 Mean 3rd Qu. Max. 200.9 295.0 480.0 Per il tempo medio di vita teorico, usiamo l’integrazione numerica: > integrand<-function(x){pweibull(x,m,b,lower.tail=FALSE)} > integrate(integrand,0,Inf) 242.4097 with absolute error < 0.019 Per il tempo mediano bisogna risolvere l’equazione con ossia Dalla prova scritta del 16 Febbraio 2015 ESERCIZIO: E’ stato realizzato un esperimento per giudicare l’effetto di 4 diversi carburanti e 2 differenti tipi di lanciatori sul range di un certo razzo. a) Sulla base dei seguenti dati espressi in miglia marine, verificare se ci sono differenze significative effettuando un’analisi ANOVA. b) Stimare la varianza dell’errore. c) Verificare le ipotesi che consentono l’applicazione dell’ANOVA. d) Dal grafico delle interazioni, determinare (qualora ci fossero) quelle coppie di livelli che hanno maggiore interazione e quantificarne il valore numerico. LanR X LanR Y Carburante I 62.5 58.7 65.8 59.4 40.4 45.2 42.3 46.2 Carburante II Carburante III Carburante IV 49.3 52.4 33.8 35.9 43.6 47.8 55.6 51.9 42.9 45.2 51.2 45.7 39.7 38.9 47.4 44.2 50.4 59.8 42.5 44.2 46.8 49.5 58.6 57.1 I dati vanno sistemati in un file. Usando il blocco note, digitare i dati al seguente modo: 5 22/01/2016 Dopo aver salvato il file, in ambiente R posizionarsi nella cartella dove il file è stato memorizzato: > setwd(‘…') > datieserc<-read.table('lanciarazzo.txt',header=TRUE) > attach(datieserc) I box-plots dei due fattori Lanciarazzo e Carburante sono > boxplot(Dati~Carb,col=c('red','blue','yellow','orange'),main='Boxplot carburante') > boxplot(Dati~LanciaR,col=c('red','blue'),main='Boxplot LanciaRazzi') Per verificare l’omogeneità delle varianze: > bartlett.test(split(Dati,list(Carb,LanciaR))) Bartlett test of homogeneity of variances Sintassi diversa nelle ultime versioni di R data: split(Dati, list(Carb, LanciaR)) Bartlett's K-squared = 3.8439, df = 7, p-value = 0.7976 Si tratta di un’ANOVA a due fattori con repliche: > results<-aov(Dati~Carb+LanciaR+Carb*LanciaR,data=datieserc) > summary(results) Df Sum Sq Mean Sq F value Pr(>F) Carb 3 464.0 154.7 13.290 2.58e-05 *** LanciaR 1 73.5 73.5 6.316 0.0191 * Carb:LanciaR 3 1110.8 370.3 31.815 1.57e-08 *** Residuals 24 279.3 11.6 Varianza dell’errore --Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1 Dalle interazione si evince che si rigetta l’ipotesi di assenza di interazione. Pertanto non è possibile proseguire con l’analisi. Per validare il modello, è comunque necessario che i residui abbiano legge gaussiana. 6 22/01/2016 Per effettuare l’analisi dei residui del fattore Lanciarazzo, è necessario calcolare le medie dei due fattori: > medialanciaX<-mean(Dati[1:16]) > medialanciaY<-mean(Dati[17:32]) > media1<-rep(medialanciaX,16) > media2<-rep(medialanciaY,16) > residuilancia<-c(Dati[1:16]-media1,Dati[17:32]-media2) > qqnorm(residuilancia) > shapiro.test(residui) Shapiro-Wilk normality test data: residui W = 0.9703, p-value = 0.5079 Per effettuare l’analisi dei residui del fattore Carburante, è necessario calcolare le medie dei livelli: > residuiC1<-c(Dati[1:4],Dati[17:20])-mean(c(Dati[1:4],Dati[17:20])) > residuiC2<-c(Dati[5:8],Dati[21:24])-mean(c(Dati[5:8],Dati[21:24])) > residuiC3<-c(Dati[9:12],Dati[25:28])-mean(c(Dati[9:12],Dati[25:28])) > residuiC4<-c(Dati[13:16],Dati[29:32])-mean(c(Dati[13:16],Dati[29:32])) > residui<-c(residuiC1,residuiC2,residuiC3,residuiC4) > qqnorm(residui) > shapiro.test(residui) Shapiro-Wilk normality test data: residui W = 0.9551, p-value = 0.2006 Poiché i residui sono gaussiani sia sulle righe che sulle colonne, le ipotesi sulla popolazione, necessarie alla applicazione dell’anova, sono verificate. 7 22/01/2016 Per stabilire quale tra i livelli dei due fattori ha interazioni, è necessario un interaction plot, ossia > interaction.plot(Carb, LanciaR, Dati,col=c('red', 'blue'),lwd=4,ylab='media dei dati') > > interaction.plot(LanciaR, Carb, Dati,col=c('red', 'blue'),lwd=4,ylab='media dei dati') > Dai grafici, si evidenzia un’interazione tra le coppie C1-C4 e C2-C3. Pertanto gli effetti vanno valutati per queste coppie: > eff11<-sum(Dati[1:4]) > eff12<-sum(Dati[5:8]) > eff13<-sum(Dati[9:12]) > eff14<-sum(Dati[13:16]) > eff21<-sum(Dati[17:20]) > eff22<-sum(Dati[21:24]) > eff23<-sum(Dati[25:28]) > eff24<-sum(Dati[29:32]) - = - = - CarbII CarbIII CarbIV eff11 eff12 eff13 eff14 LanRY eff21 eff22 eff23 eff24 Ad esempio per la coppia C2-C3 (analogamente per C1-C4) si ha: =1.725 2 3= CarbI LanRX = 3.6 = 9.25 > (eff12+eff13)/8-(eff22+eff23)/8 [1] 1.725 > (eff12+eff22)/8-(eff13+eff23)/8 [1] 3.6 > (eff12+eff23)/8-(eff22+eff13)/8 [1] 9.25 > 8 22/01/2016 ESERCIZIO: Ipotizzando di lavorare solo sui lanciarazzi, confrontare le due popolazioni X e Y sia con strumenti di analisi descrittiva che inferenziale. Ci sono differenze rispetto alle conclusioni cui si perviene all’esercizio precedente? Motivare la risposta. I dati del LanciaRazzoX sono Dati[1:16], quelli del LanciaRazzoY sono Dati[17:32]. > hist(Dati[1:16],freq=F,col='Blue',ylim=range(0,0.06),xlim=range(30,70)) > hist(Dati[17:32],freq=F,col='Blue',ylim=range(0,0.06),xlim=range(30,70)) Provengono da due popolazioni che hanno pari legge? > ks.test(Dati[1:16],Dati[17:32]) Two-sample Kolmogorov-Smirnov test data: Dati[1:16] and Dati[17:32] D = 0.3125, p-value = 0.4154 alternative hypothesis: two-sided Questa legge è gaussiana? > ks.test(Dati[1:16],"pnorm",mean(Dati[1:16]),sd(Dati[1:16])) One-sample Kolmogorov-Smirnov test data: Dati[1:16] D = 0.0868, p-value = 0.9988 alternative hypothesis: two-sided Warning message: > ks.test(Dati[17:32],"pnorm",mean(Dati[17:32]),sd(Dati[17:32])) In ks.test(Dati[1:16], Dati[17:32]) : impossibile calcolare p-value esatto in presenza di ties One-sample Kolmogorov-Smirnov test Sono indipendenti? > cor.test(Dati[1:16],Dati[17:32]) Pearson's product-moment correlation data: Dati[17:32] D = 0.1677, p-value = 0.7591 alternative hypothesis: two-sided Warning message: In ks.test(Dati[17:32], "pnorm", mean(Dati[17:32]), sd(Dati[17:32])) : ties should not be present for the Kolmogorov-Smirnov test data: Dati[1:16] and Dati[17:32] t = -1.2616, df = 14, p-value = 0.2277 alternative hypothesis: true correlation is not equal to 0 95 percent confidence interval: -0.7037557 0.2093480 sample estimates: cor -0.319515 9 22/01/2016 Per la prima popolazione, i principali indici statistici sono: > mean(Dati[1:16]); summary(Dati[1:16]) [1] 50.10625 Min. 1st Qu. Median Mean 3rd Qu. Max. 33.80 44.80 50.25 50.11 56.38 65.80 > sd(Dati[1:16]); IQR(Dati[1:16]);diff(range(Dati[1:16])) [1] 8.986692 [1] 11.575 [1] 32 Ripetere la stessa analisi anche per il secondo campione. > sd(Dati[1:16])/mean(Dati[1:16]); sd(Dati[1:16])/sqrt(16) [1] 0.1793527 [1] 2.246673 > library('e1071') > skewness(Dati[1:16]);kurtosis(Dati[1:16]) [1] -0.05834305 [1] -0.9395265 Analisi: media e mediana sono quasi coincidenti, pertanto la distribuzione è simmetrica; tale osservazione è confermata dal coefficiente di asimmetria quasi nullo; la curtosi è negativa, con una deviazione standard che è circa la quarta parte del range, ossia il campione ha una certa dispersione; la media campionaria è uno stimatore preciso. Infine per verificare se hanno medesima varianza e medesima media. > var.test(Dati[1:16], Dati[17:32], ratio = 1, alternative = "two.sided", conf.level = 0.95) F test to compare two variances data: Dati[1:16] and Dati[17:32] F = 1.8849, num df = 15, denom df = 15, p-value = 0.2311 alternative hypothesis: true ratio of variances is not equal to 1 95 percent confidence interval: 0.6585757 5.3947715 sample estimates: ratio of variances 1.884905 > t.test(Dati[1:16], Dati[17:32], mu = 0, alternative ="two.sided",paired = FALSE, var.equal = + TRUE, conf.level = 0.95) Two Sample t-test Cosa si può concludere rispetto all’esercizio precedente? data: Dati[1:16] and Dati[17:32] t = 1.0906, df = 30, p-value = 0.2841 alternative hypothesis: true difference in means is not equal to 0 95 percent confidence interval: -2.645171 8.707671 sample estimates: mean of x mean of y 50.10625 47.07500 10 22/01/2016 ESERCIZIO: Da una linea di produzione di filo di cotone sono stati prelevati, ad intervalli casuali, 25 spezzoni di cui sono stati misurati i rispettivi carichi di rottura in kg: 2.79, 2.55, 2.21, 1.97, 2.45, 2.18, 2.57, 2.13, 2.54, 2.90, 2.34, 2.28, 1.78, 2.19, 2.71, 2.35, 1.91, 1.98, 2.88, 2.45, 2.68, 1.58, 3.11, 1.90, 2.30 Formulare una ipotesi sulla legge di distribuzione dei seguenti dati e sottoporla a test. Se necessario costruire dei grafici per convalidare questa tesi. Stimare la funzione di affidabilità ed effettuarne il grafico. Calcolare il tasso di rottura empirico. Calcolare il carico di rottura medio. Trattandosi di un campione univariato, i dati possono essere direttamente inseriti in un vettore > dati<-c(2.79, 2.55, 2.21, 1.97, 2.45, 2.18, 2.57, 2.13, 2.54, 2.90, 2.34, 2.28, 1.78, 2.19, 2.71, + 2.35, 1.91, 1.98, 2.88, 2.45, 2.68, 1.58, 3.11, 1.90, 2.30) > > mean(dati); summary(dati) [1] 2.3492 Min. 1st Qu. Median Mean 3rd Qu. Max. 1.580 2.130 2.340 2.349 2.570 3.110 > > sd(dati); IQR(dati);diff(range(dati)) [1] 0.3798456 [1] 0.44 [1] 1.53 Il carico di rottura medio è 2.3492 > sd(dati); IQR(dati);diff(range(dati)) [1] 0.3798456 [1] 0.44 [1] 1.53 > skewness(dati);kurtosis(dati) [1] 0.008315056 [1] -0.780604 > sd(dati)/sqrt(length(dati)); sd(dati)/mean(dati) [1] 0.07596912 [1] 0.1616915 > hist(dati,freq=F,col='Blue') > boxplot(dati,col='blue',main='Boxplot dati') > L’andamento risulta essere gaussiano. > lines(density(dati),col='red',lwd=3) > 11 22/01/2016 > ks.test(dati,"pnorm",mean(dati),sd(dati)) One-sample Kolmogorov-Smirnov test data: dati D = 0.0745, p-value = 0.9991 alternative hypothesis: two-sided Per validare l’esito del test, confrontiamo la funzione di ripartizione empirica e quella teorica. Warning message: In ks.test(dati, "pnorm", mean(dati), sd(dati)) : ties should not be present for the Kolmogorov-Smirnov test > plot.ecdf(dati,col='blue',ylim=range(0,1), + xlim=range(1.5,4.0)) > par(new=TRUE) > plot(sort(dati),pnorm(sort(dati),mean(dati), + sd(dati)),type='l',lwd=3,col='red',ylim=range(0,1), + xlim=range(1.5,4.0),ylab=' ') > > cf<-ecdf(dati) Per costruire la funzione di ripartizione empirica > cf(sort(dati)) [1] 0.04 0.08 0.12 0.16 0.20 0.24 0.28 0.32 0.36 0.40 0.44 0.48 0.52 0.56 0.64 [16] 0.64 0.68 0.72 0.76 0.80 0.84 0.88 0.92 0.96 1.00 > > plot(sort(dati),1-cf(sort(dati)),type='S',col='red', La funzione di affidabilità si ottiene + main='Affidabilità') al seguente modo: > Per costruire il tasso di guasto: Le densità vanno accoppiate ai punti centrali delle classi e divisi per la funzione di affidabilità. > obj<-hist(dati,freq=F) > obj $breaks [1] 1.4 1.6 1.8 2.0 2.2 2.4 2.6 2.8 3.0 3.2 $counts [1] 1 1 4 3 5 5 3 2 1 $density [1] 0.2 0.2 0.8 0.6 1.0 1.0 0.6 0.4 0.2 $mids [1] 1.5 1.7 1.9 2.1 2.3 2.5 2.7 2.9 3.1 $xname [1] "dati" $equidist [1] TRUE attr(,"class") [1] "histogram" 12 22/01/2016 Per calcolare il tasso di guasto, si considera a) la densità valutata nei punti centrali delle classi; b) si calcola la funzione di ripartizione nei centri delle classi obj$mids[i] usando la function cumulativa sum() c) si calcola la funzione di affidabilità complementando la funzione di ripartizione; d) si calcola il tasso, dividendo la densità per la funzione di affidabilità > r<-vector() > for(i in 1:9) r[i] <- 1-(sum(dati<=obj$mids[i])/25); >r [1] 1.00 0.96 0.88 0.76 0.52 0.36 0.20 0.04 0.04 > obj$density/r [1] 0.2000000 0.2083333 0.9090909 0.7894737 1.9230769 2.7777778 3.0000000 [8] 10.0000000 5.0000000 ESERCIZIO: Supponiamo di sottoporre a controllo una macchina per la foratura di pannelli di legno. I fori praticati devono avere un diametro di 2cm. I dati raccolti durante i controlli indicano che lo scarto tipo dal valore medio è 0.15cm. Se si assume che lo spostamento massimo consentito nel controllo finale è 0.1 cm e che la conseguente rilavorazione dell’apparato costa 15 euro, determinare la funzione perdita teorica associata al processo di foratura ed effettuarne un grafico. Determinare la perdita media associata al suddetto processo di controllo. Il tipo è Normal is better . La funzione perdita è di tipo L ( x) = K ( x − 2) 2 Poiché si ha: K = costo 15 = = 1500 posto 2 scostam.massimo 0.12 µ = x0 = 2, si ha che la funzione perdita media risulta 1500*0.15*0.15. 26 13 22/01/2016 ESERCIZIO: La lunghezza complessiva di un accendisigari usato nelle macchine viene monitorato attraverso una carta di controllo. Costruire la carta. Calcolare gli indici di capacità del processo ipotizzando che le specifiche del processo siano 7 e 15. Costruire la carta di tolleranza. Campione Osservazioni 1 2 3 4 1 15 10 8 9 2 14 14 10 6 3 9 10 9 11 4 8 6 9 13 5 14 8 9 12 6 9 10 7 13 7 15 10 12 12 8 14 16 11 10 9 11 7 16 10 10 11 14 11 12 11 13 8 9 5 12 10 15 8 10 13 8 12 14 9 14 15 12 14 6 15 13 16 9 5 16 14 8 8 12 17 8 10 16 9 18 8 14 10 9 19 13 15 10 8 20 9 7 15 8 Trascriviamo i dati in un file. 27 > datiaccendi<-read.table('accendisigari.txt', header=TRUE) > attach(datiaccendi) > library('qcc') Carico il pacchetto richiesto: MASS Package 'qcc', version 2.2 Type 'citation("qcc")' for citing this R package in publications. > qcc(datiaccendi,type='xbar') Il processo appare in controllo. 14 22/01/2016 Per la carta sull’escursione, siccome i sottogruppi hanno taglia costante pari a 5, è necessario usare il metodo "UWAVE-R" > qcc(datiaccendi,type='R') > obj<-qcc(datiaccendi,type='xbar') > process.capability(obj, spec.limits=c(7, 15)) Process Capability Analysis il processo non è capace di produrre entro i limiti di specifica > cp<-(15-7)/(6*3.27829) > cp [1] 0.4067161 Call: process.capability(object = obj, spec.limits = c(7, 15)) Number of obs = 80 Center = 10.7 StdDev = 3.27829 Target = 11 LSL = 7 USL = 15 Capability indices: Value 2.5% 97.5% Cp 0.4067 0.3434 0.4699 Cp_l 0.3762 0.2976 0.4548 Cp_u 0.4372 0.3534 0.5211 Cp_k 0.3762 0.2825 0.4699 Cpm 0.4050 0.3421 0.4679 Exp<LSL 13% Obs<LSL 6.2% Exp>USL 9.5% Obs>USL 5% 15 22/01/2016 > obj<-qcc(datiaccendi,type='xbar') > process.capability(obj, spec.limits=c(7, 15)) E’ centrato Process Capability Analysis Call: process.capability(object = obj, spec.limits = c(7, 15)) Number of obs = 80 Center = 10.7 StdDev = 3.27829 Target = 11 LSL = 7 USL = 15 Capability indices: Value 2.5% 97.5% Cp 0.4067 0.3434 0.4699 Cp_l 0.3762 0.2976 0.4548 Cp_u 0.4372 0.3534 0.5211 Cp_k 0.3762 0.2825 0.4699 Cpm 0.4050 0.3421 0.4679 Exp<LSL 13% Obs<LSL 6.2% Exp>USL 9.5% Obs>USL 5% > obj<-qcc(datiaccendi,type='xbar') > process.capability(obj, spec.limits=c(7, 15)) Process Capability Analysis Non c’è uno scostamento significativo della media del processo dal target Call: process.capability(object = obj, spec.limits = c(7, 15)) Number of obs = 80 Center = 10.7 StdDev = 3.27829 Target = 11 LSL = 7 USL = 15 Capability indices: Value 2.5% 97.5% Cp 0.4067 0.3434 0.4699 Cp_l 0.3762 0.2976 0.4548 Cp_u 0.4372 0.3534 0.5211 Cp_k 0.3762 0.2825 0.4699 Cpm 0.4050 0.3421 0.4679 Exp<LSL 13% Obs<LSL 6.2% Exp>USL 9.5% Obs>USL 5% 16 22/01/2016 > obj<-qcc(datiaccendi,type='xbar') > process.capability(obj, spec.limits=c(7, 15)) Process Capability Analysis % attesa di prodotti non conformi è circa 23% Call: process.capability(object = obj, spec.limits = c(7, 15)) Number of obs = 80 Center = 10.7 StdDev = 3.27829 Target = 11 LSL = 7 USL = 15 Capability indices: Value 2.5% 97.5% Cp 0.4067 0.3434 0.4699 Cp_l 0.3762 0.2976 0.4548 Cp_u 0.4372 0.3534 0.5211 Cp_k 0.3762 0.2825 0.4699 Cpm 0.4050 0.3421 0.4679 Exp<LSL 13% Obs<LSL 6.2% Exp>USL 9.5% Obs>USL 5% > obj<-qcc(datiaccendi,type='xbar') > process.capability(obj, spec.limits=c(7, 15)) Process Capability Analysis = % osservata di prodotti non conformi è circa 11% Call: process.capability(object = obj, spec.limits = c(7, 15)) Number of obs = 80 Center = 10.7 StdDev = 3.27829 Target = 11 LSL = 7 USL = 15 Capability indices: Value 2.5% 97.5% Cp 0.4067 0.3434 0.4699 Cp_l 0.3762 0.2976 0.4548 Cp_u 0.4372 0.3534 0.5211 Cp_k 0.3762 0.2825 0.4699 Cpm 0.4050 0.3421 0.4679 Exp<LSL 13% Obs<LSL 6.2% Exp>USL 9.5% Obs>USL 5% 17 22/01/2016 CARTA DI TOLLERANZA > x<-seq(1,20,1) > for (i in 1:20){ + plot(rep(i,4),datiaccendi[i,],type='b',lwd=4,col='red',xlim=range(0,20),ylim=range(5,17),ylab=' ') + par(new=TRUE)} > Per posizionare il limite superiore: > plot(x,rep(15.61,20),type='l',col='blue',lwd=4,ylim=range(5,17),xlim=range(0,20),ylab=' ') > par(new=TRUE) > 18 22/01/2016 Per posizionare il limite inferiore: > plot(x,rep(5.78,20),type='l',col='blue',lwd=4,ylim=range(5,17),xlim=range(0,20),ylab=' ') > Da questa carta, si evince che i sottogruppi 8 e 9, i sottogruppi 11, 15 e 17 escono dalle specifiche richieste. 19