1 Operazioni elementari sui vettori

1.1 Generazione e visualizzazione di un vettore

Il comando base di generazione di un vettore è la concatenazione.

x = c(1,2,4)
x

Anche il singolo valore numerico è pensato come vettore di lunghezza 1. In realtà quindi il comando di concatenazione concatena vettori.

y=c(x,8)
y

1.2 Lunghezza di un vettore

x = c(1,2,4)
length(x)

1.3 Visualizzazione di parti o funzioni di un vettore

x[3]
z=1/x
z
x*z
y=c(1,3)
x*y

L’operazione è stata eseguita lo stesso, ma il software ha restituito un messaggio di avviso. Le operazioni che esso ha eseguito sono le seguenti

  • y1=c(y,y): concatenazione di due copie del vettore più corto,
  • y2=y[1:3]: adattamento della lunghezza,
  • x*y2: operazione aritmetica coerente.
r=c(1,4,5,6)
y
r
r*y

Stavolta il software non ha emesso un messaggio di avviso, perché la lunghezza di \(z\) è un multiplo della lunghezza di \(y\).

y
y^2

1.4 Alcune operazioni con i vettori

z
abs(z)
u = c(1,-2,0.53567)
abs(u)
round(u)
length(u)
min(u)
max(u)
max(abs(u))
sum(u)
sort(u)
rev(u)
rev(sort(u))

1.5 Primi comandi statistici

mean(x)
mean(u)
sd(u)

1.6 Generazione di sequenze

q = 1:10
q
q = 10:1
q
seq(from=0, to=1, by=0.01)
seq(0,1,0.01)

Ma lo stesso vettore si poteva ottenere anche nel modo seguente (notare l’ordine con cui le operazioni sono eseguite):

1:100/100

1.7 Oggetti in memoria

ls()
rm(z)
ls()

1.8 Variabili Booleane e dati mancanti

Fortemente sconsigliato definire oggetti con i nomi T, F, NA, perché sono variabili interne di R predefinite.

T
F
NA

1.9 Manipolazione di vettori

q = 1:100
q
q[99:100] =  c(199,200)
q
q[99:100]=5
q
q[98:100]=c(1,2)
q
q=1:100
q[98]=2
q[100]=500
q
q[100]=NA
q
q[-(1:10)]
o = 1:10
o[11:100]=11:100
o
o=1:10
o[20:30]=20:30
o

1.10 Commenti in R

#ciao

2 Operazioni elementari sulle matrici

2.1 Generazione di matrici

Creazione di una matrice con dati numeri di righe e colonne (qui ad esempio \(4\times 6\)),

A = matrix(nrow=4,ncol=6)

La creazione e il suo popolamento possono essere fatti simultaneamente,

z = 1:24
A = matrix(z,4,6)
A

Il riempimento avviene per colonne. Se si vuole ottenere il riempimento per righe si può operare per trasposizione,

B = matrix(z,6,4)
t(B)

oppure usare il comando seguente:

A = matrix(z,4,6,byrow=T)
A

2.2 Dimensione di una matrice

Il comando per la dimensione è un vettore. I singoli valori possono essere ottenuti separatamente,

dim(A)
dim(A)[2]
nrow(A)
ncol(A)

2.3 Alcune funzioni sulle matrici

Come per i vettori, funzioni di variabile reale calcolate su matrici si intendono applicate elemento per elemento,

A
A^2

La matrice diagonale con diagonale il vettore y

diag(y)

La trasposta di una matrice

A = matrix(1:24,4,6)
A
t(A)

Il determinante

Q=matrix(1:25,5,5)
det(Q)

Riempimento di una matrice con numeri casuali

E = rnorm(25)
Q=matrix(E,5,5)
Q
det(Q)

La matrice inversa

solve(Q)

Il prodotto Q*solve(Q) non restituisce la matrice identica, perché, come per i vettori, l’operatore * è inteso come prodotto elemento per elemento. Il prodotto tra matrici è implementato con il simbolo %*%,

Q %*% solve(Q)
I = Q %*% solve(Q)
round(I)

2.4 Visualizzazione di parti di una matrice

Selezione di un elemento,

A[2,3]

Selezione di una riga,

A[,2]

Selezione di una colonna,

A[3,]

Selezione di range di righe e colonne,

A[2:3,]
A[,c(3,5)]
A[1:2,c(3,5)]

La concatenazione tra matrici restituisce vettori,

B=A
c(A,B)

Così come la concatenazione di una singola matrice (notare l’ordine degli elementi nel vettore),

A
c(A)

Somma di matrici,

A1 = matrix(1:24,6,4)
A2 = matrix(1,6,4)
A1
A2
A1+A2
A1-A2

2.5 Prodotti matriciali

Consideriamo il prodotto righe per colonne (ovvero l’operatore %*% Ricordiamo che per moltiplicare due matrici, il numero di colone della prima deve essere uguale al numero di righe della seconda. Il codice seguente darà errore,

B=matrix(2,4,2)
dim(A1)
dim(B)
A1 %*% B

Invece questo funziona,

dim(t(B))
A1 %*% t(B)

Un vettore, in termini di prodotti tra matrici, è considerato come una matrice con una sola colonna,

y=1:4
A1 %*% y

2.6 Ricerca di autovalori e autovettori

Il comando eigen restituisce un output più complesso rispetto a quanto visto fino a ora,

eigen(Q)

Le componenti della struttura possono essere estratte con l’operatore $,

EVV = eigen(Q)
EVV$values
EVV$vectors

Si possono valutare i soli autovalori,

EV = eigen(Q,only.values=T)
EV

2.7 Classe di un oggetto

I vettori sono l’unità base,

class(1:5)
class(seq(0,1,0.1))
class(EVV$values)
Q=matrix(rnorm(20),5,4)
class(Q)
class(EVV)
class(EV)

Certi oggetti possono essere ``rievocati’’ come elementi di altre classi, almeno se possibile,

as.numeric(Autovalori)

Una classe che sarà utile nel seguito è il data frame, a prima vista non molto differente da una matrice,

P=data.frame(Q)
class(P)
P[2,3]

Righe e colonne hanno etichette,

row.names(P)
colnames(P)

Le etichette si possono cambiare,

row.names(P)<-c("Riga 1","Riga 2","Riga 3","Riga 4","Riga 5")
colnames(P)<-c("Colonna 1","Colonna 2","Colonna 3","Colonna 4")
P

Aggiungere una colonna al data frame P

b=rnorm(5)
P$"Colonna 5"<-b
P

Aggiungere una riga al data frame P

nr = data.frame(matrix(rnorm(5),1,5))
colnames(nr)<-c("Colonna 1","Colonna 2","Colonna 3","Colonna 4","Colonna 5")
row.names(nr)<-c("Nuova riga")
P <- rbind(P,nr)
P

3 Importazione di dati

3.1 Clipboard

In dipendenza del sistema operativo i comandi per importare i dati possono essere diversi (soprattutto quando si importa dalla clipboard). L’effetto di alcuni di questi comandi potrebbe non essere quello atteso, e ciò potrebbe dipendere dai fattori più disparati, come la versione del Software, o l’estensione del file da cui state copiando la tabella.

Caricare dati dalla clipboard (windows)

A <- read.table("clipboard")
A <- read.table("clipboard",header=T)

3.2 File esterni

Nel caso di uso di comandi quali ad esempio read.csv, il software R si aspetta di trovare i file indicati nella cosiddetta working directory. Il software R ha due comandi per conoscere o assegnare la working directory. Questi comandi sono:

  • conoscere: getwd()
  • assegnare: setwd(\(\langle\)percorso completo della cartella\(\rangle\))
  • visualizzarne il contenuto: dir()

3.2.1 Caricamento di dati da file.

Tabella csv senza etichette di riga o colonna.

A <- read.csv("01prova.csv",header=F)
fix(A)
A <- read.csv("01prova.csv")
fix(A)

Tabella csv con etichette di colonna ma non di riga

A <- read.csv("02prova.csv",header=F)
fix(A)
A <- read.csv("02prova.csv")
fix(A)

Tabella csv con etichette di colonna e di riga. Se la prima riga (con i nomi delle colonne) contiene un elemento in meno, la prima colonna è usata per i nomi di riga.

A <- read.csv("03prova.csv",header=F)
fix(A)
A <- read.csv("03prova.csv")
fix(A)
A <- read.csv("03prova.csv",row.names=1)
fix(A)

Nel caso il file csv sia in formato locale italiano (ovvero il separatore per il decimale è la virgola, e il separatore di campi è il punto e virgola).

A <- read.csv("04prova.csv")
fix(A)
A <- read.csv("04prova.csv",sep=";",dec=",")
fix(A)

3.2.2 Ancora sulla working directory

La scelta della working directory dipende dalla piattaforma (Windows, Mac, Linux) e dal programma (RStudio, RGui, etc.) usati.

Ad esempio un utente MAC potrebbe settare il suo Desktop come working directory con il comando

setwd("/Users/\(\langle\)nome utente\(\rangle\)/Desktop")

Il \(\langle\)nome utente\(\rangle\) dipende dalla propria installazione, e il comando getwd() può essere utile a conoscere il proprio.

Dunque un utente che conserva tutti i suoi file R per il corso nella cartella Stat2 (ad esempio) potrebbe digitare all’inizio di ogni sessione il comando

  • per un utente MAC la cui cartella Stat2 è sul Desktop:

    setwd("/Users/\(\langle\)nome utente\(\rangle\)/Desktop/Stat2")

  • per un utente Windows la cui cartella Stat2 è una sotto-cartella della cartella Documenti:

    setwd("C:/Users/\(\langle\)nome utente\(\rangle\)/Documenti/Stat2")

  • per un utente Linux la cui cartella Stat2 è nella sua home:

    setwd("/home/\(\langle\)nome utente\(\rangle\)/Stat2")

Nel caso si utilizzi il programma Rgui, la soluzione più semplice è di assegnare la working directory direttamente da programma:

  • per un utente MAC: sulla toolbar: Misc \(\to\) Change working directory
  • per un utente Windows: sulla toolbar: ?

Analogamente, nel caso si utilizzi invece il programma Rstudio,

  • per un utente MAC: sulla toolbar: Session \(\to\) Set Working Directory \(\to\) Choose Directory
  • per un utente Windows: sulla toolbar: Tools \(\to\) Global options \(\to\) Default working directory
  • per un utente Linux: sulla toolbar: Tools \(\to\) Global options \(\to\) Default working directory

4 Visualizzazione di base

Iniziamo con il comando di base per disegnare grafici di interesse per la rappresentazione di dati statistici, ed alcune delle opzioni di base per rendere più significativa la rappresentazione dei dati.

Un vettore viene disegnato prendendo come dati per le ascisse gli indici degli elementi.

X=0:25
plot(X)

Una coppia di vettori viene rappresentata utilizzando il primo vettore per le ascisse e il secondo vettore per le ordinate.

Y=X^2
plot(X,Y)

Il comando seguente dà lo stesso risultato del precedente. Nel caso la matrice abbia più di due colonne, vengono utilizzate solo le prime due colonne.

Z=matrix(c(X,Y),26,2)
plot(Z)

Il tipo di rappresentazione dei dati può essere modificata con l’opzione type, che prende i valori p, l, b, c, o, h, s, S, n (p è il default). Il caso type="n" non disegna nulla.

plot(X,Y,type="l")

Si può variare anche il tipo di linea, con l’opzione lty, che varia da 0 a 7.

plot(X,Y,type="l",lty=2)

L’opzione pch varia il tipo di rappresentazione del punto-dato.

plot(X,Y,pch=0:25)

L’opzione pch può anche prendere come valore alcuni caratteri.

plot(X,Y,pch="$")

L’opzione lwd varia lo spessore della linea

plot(X,Y,type="l",lwd=3)

L’opzione col varia il colore

plot(X,Y,col="red")
plot(X,Y,col=0:7)

I colori di base sono i seguenti

palette()
pie(rep(1,8),col=palette(),labels=palette())

C’è a disposizione un set di colori più ampio, dato dal vettore colours(), di cui diamo un campione con i comandi seguenti.

colours()[31:60]
hist(1:60,30,col=colours()[31:60])

L’opzione asp varia il rapporto tra le unità di misura dei due assi.

plot(X,Y,asp=1)
plot(X,Y,asp=0.04)

Se disegnamo una matrice (ma solo come classe data.frame) che abbia più di 2 colonne, otteniamo una matrice di rappresentazioni grafiche delle colonne accoppiate a due a due.

Z=matrix(c(X,X^2,X^3),26,3)
plot(as.data.frame(Z))

Ad esempio, possiamo riottenere uno dei riquadri selezionando le opportune colonne.

plot(Z[,3],Z[,1])

5 Alcuni comandi statistici

La densità della distribuzione normale standard.

X=seq(-4,4,0.01)
plot(X,dnorm(X),type="l")

La funzione di ripartizione della distribuzione normale standard.

plot(X,pnorm(X),type="l")

La funzione dei quantili della distribuzione normale standard.

Y=seq(0,1,0.01)
plot(Y,qnorm(Y),type="l")

Funzione di ripartizione e funzione dei quantili sono l’una inversa dell’altra.

plot(X,qnorm(pnorm(X)),type="l")
plot(Y,pnorm(qnorm(Y)),type="l")

Comando per generare 10000 numeri campionati da una distribuzione normale standard.

Z=rnorm(10000)
plot(Z)
plot(Z,pch=".")

Visualizziamoli come punti a coordinate casuali.

plot(matrix(Z,5000,2),pch=".",asp=1)

Lo stesso, ma con distribuzione uniforme.

plot(matrix(runif(10000),5000,2),pch=".")

Lo stesso, ma con la distribuzione esponenziale.

plot(matrix(rexp(10000,0.3),5000,2),pch=".")

Lo stesso, ma con la distribuzione binomiale. In questo caso la rappresentazione è più opportuna con un istogramma.

hist(rbinom(10000,20,0.3),20)

Alcuni dei principali indicatori statistici.

X=1:100
mean(X)
sd(X)
median(X)
quantile(X,c(0,0.25,0.5,0.75,1))

Possiamo disegnare la funzione di ripartizione empirica di una serie di dati.

plot(ecdf(rnorm(10)))
plot(ecdf(rnorm(10)),pch=".")
plot(ecdf(rnorm(100)),pch=".")
Y=seq(-4,4,0.01)
plot(pnorm(Y),type="l")

6 Comandi grafici più avanzati

Vogliamo ora sovrapporre alla funzione di ripartizione campionaria la corrispondente funzione di ripartizione teorica. Usiamo quindi il comando di secondo livello lines.

plot(ecdf(rnorm(100)),pch=".")
lines(Y,pnorm(Y),col="red",type="l")

La corrispondenza è sempre più precisa all’aumentare della numerosità del campione. In realtà è più efficace confrontare le densità (lo vedremo in seguito).

plot(ecdf(rnorm(1000)),pch=".")
lines(Y,pnorm(Y),col="red",type="l")

Passiamo a studiare il comando di primo livello per disegnare istogrammi.

X=sort(rnorm(100))
hist(X)

La seconda opzione permette di variare il numero di classi. Tale opzione può essere impostata in maniera articolata (si suggerisce di digitare ?hist per ulteriori dettagli)

hist(X,20)

Con l’opzione freq=FALSE passiamo dalle frequenze assolute alle frequenze relative.

hist(X,20,freq=FALSE)

Possiamo aggiungere la densità empirica.

hist(X,20,freq=FALSE)
lines(density(A), col="red")

Sapendo che il campione è estratto da una normale standard, disegnamo la corrispondente densità.

hist(X,20,freq=FALSE)
lines(density(X), col="red")
lines(X,dnorm(X),col="blue")

Risulta però più sensato disegnare la normale che ha la media e la deviazione standard del campione in esame.

hist(X,20,freq=FALSE)
lines(density(X), col="red")
lines(X,dnorm(X,mean(X),sd(X)),col="green3")

La corrispondenza è più precisa all’aumentare del campione

X=sort(rnorm(10000))
hist(X,100,freq=FALSE)
lines(density(X), col="red")
lines(X,dnorm(X,mean(X),sd(X)),col="green3")

7 Esercizi

7.0.1

Generare un vettore che contiene i numeri da 1 a 10, e unirlo alla sua versione ribaltata (ovvero con valori decrescenti), per ottenere un vettore di 20 elementi. Valutarne la media.

7.0.2

Generare un vettore che contiene 20 valori casuali. Rimpiazzare i 10 valori centrali con i loro corrispondenti quadrati.

7.0.3

Generare una matrice \(5\times 5\) che contiene elementi casuali, e calcolarne il determinante. Ripetere la prova per 10 volte, e calcolare il valore medio e la deviazione standard dei valori ottenuti.

7.0.4

Generare una matrice \(A\) di dimensioni \(4\times 6\) ed un vettore \(b\) di lunghezza 4. Ottenere una nuova matrice \(4\times 7\) le cui prime 6 colonne sono le colonne di \(A\) e la settima contiene i valori di \(b\).

7.0.5

Generare una matrice \(A\) di dimensioni \(4\times 6\) ed un vettore \(b\) di lunghezza 6. Ottenere una nuova matrice \(5\times 6\) le cui prime 4 righe sono le righe di \(A\) e la quinta contiene i valori di \(b\).

7.0.6

Scaricare il file 01prova.csv ed importarlo in una tabella \(B\). Calcolare media e varianza di ogni colonna. Dire a che classe appartiene \(B\). Ripetere l’esercizio con il file 04prova.csv.

7.0.7

Cercare sul manuale di R (ad esempio digitando il comando ?plot sulla console di R, oppure on line all’indirizzo https://cran.r-project.org/manuals.html) il significato delle diverse possibilità per l’opzione type del comando plot, e per ognuna di esse generare un grafico, usando eventualmente dati opportuni.

7.0.8

Generare un unico grafico che contenga dati rappresentati con diversi tipi di linea.

7.0.9

Generare dati casuali con distribuzione di Poisson (il comando è rpois) e con distribuzione geometrica (rgeom) e rappresentarli attraverso opportuni istogrammi.

7.0.10

Generare dati casuali campionati da distribuzioni uniforme, esponenziale, geometrica e di Poisson, rappresentare su un grafico le corrispondenti funzioni di ripartizione teorica ed empirica, ai fini del confronto.

7.0.11

Ripetere quanto richiesto nell’esercizio precedente, confrontando però le frequenze empiriche e le densità teoriche.

7.0.12

Rappresentare su un unico grafico due vettori riempiti con numeri casuali. Le rappresentazioni dei due vettori devono distinguersi per tipo di linea, colore e tipo di punto. Aggiungere poi al grafico,

  • titolo, sotto-titolo e etichette per i due assi, eventualmente usando anche il comando title;
  • una legenda, ovvero un piccolo riquadro che etichetta i dati, usando il comando legend.