1. Introduzione a R Enrico Properzi - [email protected]@unibo.it A.A....

35
1. Introduzione a R Enrico Properzi - [email protected] A.A. 2010/2011

Transcript of 1. Introduzione a R Enrico Properzi - [email protected]@unibo.it A.A....

Page 1: 1. Introduzione a R Enrico Properzi - enrico.properzi3@unibo.itenrico.properzi3@unibo.it A.A. 2010/2011.

1. Introduzione a R

Enrico Properzi - [email protected] A.A. 2010/2011

Page 2: 1. Introduzione a R Enrico Properzi - enrico.properzi3@unibo.itenrico.properzi3@unibo.it A.A. 2010/2011.

R è un ambiente integrato che permette di elaborare dati, eseguire calcoli ed effettuare rappresentazioni grafiche.

Caratteristiche principali:•Si compone di un insieme di strumenti per l’analisi statistica dei dati•È un linguaggio object-oriented (come Java o C++) •È interamente gratuito•E’ multipiattaforma (Windows, MacOsX, Linux, Unix…)

Page 3: 1. Introduzione a R Enrico Properzi - enrico.properzi3@unibo.itenrico.properzi3@unibo.it A.A. 2010/2011.

•Non ha una GUI (interfaccia grafica) •Non ha servizi si supporto commerciali “ufficiali”

C’è un’ampia documentazione disponibile per R:•“An introduction to R”, distribuito con R, è un buon punto di partenza•FAQ•http://cran.r-project.org/other-docs.html

Page 4: 1. Introduzione a R Enrico Properzi - enrico.properzi3@unibo.itenrico.properzi3@unibo.it A.A. 2010/2011.

Oltre a molte guide disponibili sul sito www.r-project.org e più in generale su internet è possibile chiamare alcune funzioni di aiuto mentre si sta lavorando con il programma:

•help.stat() mostra una pagina web attraverso la quale si accede a manuale e informazioni generali

•?comando o help (comando) consentono di accedere direttamente all’aiuto in linea di un determinato comando

•help.search(argomento) permette di cercare informazioni su comandi di cui non si conosce il nome o su gruppi di comandi.

Page 5: 1. Introduzione a R Enrico Properzi - enrico.properzi3@unibo.itenrico.properzi3@unibo.it A.A. 2010/2011.

WorkspaceWorkspace: è lo spazio di lavoro che contiene tutti gli oggetti creati.

All’avvio R carica il file .RData e quando esce ti viene data la possibilità di salvare il workspace in questo file.

Alcuni comandi per la gestione del workspace:

> source("comandi.R") legge il file comandi.R ed esegue i comandi in esso contenuti

> sink("output.txt") reindirizza i risultati, che di solito appaiono a video, verso il file output.txt

> ls() elenca gli oggetti contenuti nel workspace corrente

> rm() elimina uno o più oggetti dallo spazio di lavoro

> save.image() salva il workspace corrente nel file ".RData“

> save(x, y, file = "xy.Rdata") salva solo gli oggetti x e y nel file indicato

> load("xy.Rdata") legge il file indicato e ripristina gli oggetti precedentemente salvati

Page 6: 1. Introduzione a R Enrico Properzi - enrico.properzi3@unibo.itenrico.properzi3@unibo.it A.A. 2010/2011.

È possibile verificare quale sia il la directory di lavoro attiva con il comando getwd()

> getwd()[1] "C:/Documents and Settings/utente/Documenti"

Per modificare la directory di lavoro si utilizza invece il comando setwd()

> setwd("c:/laboratorioR/")

In alternativa da menù andate in "File|Cambia directory. . . “

Ognuno imposti come directory attiva z:\laboratorio R\cognome.nome.

Page 7: 1. Introduzione a R Enrico Properzi - enrico.properzi3@unibo.itenrico.properzi3@unibo.it A.A. 2010/2011.

Funzioni somma: sum() prodotto: prod() valore assoluto: abs() segno: sign()

esponenziale: exp() logaritmo: log() logaritmo in base 2: log2() logaritmo in base 10:

log10() radice quadrata: sqrt()

Operatori logici e di confronto < minore > maggiore <= minore o uguale >= maggiore o uguale == uguale != diverso

& AND | OR ! NOT

Page 8: 1. Introduzione a R Enrico Properzi - enrico.properzi3@unibo.itenrico.properzi3@unibo.it A.A. 2010/2011.

Operazioni elementari con RLa console di R può essere utilizzata come semplice calcolatrice.

Per le quattro operazioni base si utilizzano i segni: + - * / Per l'elevamento a potenza si utilizza ^ oppure **. Esempio: 3^2 Per la radice quadrata si impiega il comando sqrt().

> (2 - 3)/6[1] -0.1666667

> 2^2[1] 4

> sqrt(9)[1] 3

Attenzione: R è case sensitive> Sqrt(9)Errore: non trovo la funzione "Sqrt"

Page 9: 1. Introduzione a R Enrico Properzi - enrico.properzi3@unibo.itenrico.properzi3@unibo.it A.A. 2010/2011.

Gli oggetti di R

R è un linguaggio di programmazione a oggetti. I principali tipi di oggetto che possono essere creati in R sono:

Vettori Matrici Array Liste Data Frames

Page 10: 1. Introduzione a R Enrico Properzi - enrico.properzi3@unibo.itenrico.properzi3@unibo.it A.A. 2010/2011.

Tipologie elementari dei dati:

Logici> x <- T> y <- F> x; y[1] TRUE[1] FALSE

Numerici> x <- 4; y <- sqrt(7)> a; b[1] 4[1] 2.645751

Numeric, Integer,Complex

Stringhe

> x <- "string"> y <- “x"; z <- x> x; y; z[1] "string"[1] “x"[1] "string"

Fattori: I fattori possono assumere solo valori discreti, definiti come livelli. Es: dati qualitativi o dati ordinali

> vProv <- c("BO", "BO", "FC", "RA", "FC")> vProv[1] "BO" "BO" "FC" "RA" "FC”

> fProv <- factor(vProv)> fProv

[1] BO BO FC RA FC FC RALevels: BO FC RA

> summary(fProv)BO FC RA

> x <- "1"; y <- 1> x; y[1] "1"[1] 1

Page 11: 1. Introduzione a R Enrico Properzi - enrico.properzi3@unibo.itenrico.properzi3@unibo.it A.A. 2010/2011.

Un vettore di dimensione n può essere definito come una sequenza ordinata di n elementi dello stesso tipo

Assegnazione:

> x<-7> x[1] 7

> y <- c(2,7,4,1)> y[1] 2 7 4 1

Un vettore può anche contenere valori logici o caratteri

nomi <- c("Alberto","Laura","Mario","Ugo","Martina","Andrea")

z <- c(TRUE,TRUE,FALSE,TRUE)

È possibile definire un dato mancante all’interno del vettore con NA

Y <- c(3, 6, 2, NA)

Page 12: 1. Introduzione a R Enrico Properzi - enrico.properzi3@unibo.itenrico.properzi3@unibo.it A.A. 2010/2011.

> x <- c(-1, 2, 3, 4)

> length (x)[1] 4

> max (x)[1] 4

> min(x)[1] -1

> sum (x)[1] 8

> prod(x)[1] -24 > mean(x)[1] 2 > sqrt(x)[1] NaN 1.414 1.732 2.000

> x <- c(2,3,4)> y <- c(5,6,7)

> x*y[1] 10 18 28

> x+y[1] 7 9 11

> x-y[1] -3 -3 -3

> x+y-3[1] 4 6 8

> x>y[1] FALSE FALSE FALSE

Page 13: 1. Introduzione a R Enrico Properzi - enrico.properzi3@unibo.itenrico.properzi3@unibo.it A.A. 2010/2011.

> x <-1:8> x[1] 1 2 3 4 5 6 7 8

Il comando 1: 8 è equivalente al comando seq(1,8) solo che questa seconda versione offre in più la possibilità di specificare il passo della successione:

> y <- seq(1,8)> y[1] 1 2 3 4 5 6 7 8

> x <- seq(-3,8)> x [1] -3 -2 -1 0 1 2 3 4 5 6 7 8

Se vogliamo accedere al terzo elemento del vettore x scriveremo:

> x[3][1] -1

> z <- seq(-3,8,2)> z[1] -3 -1 1 3 5 7

Page 14: 1. Introduzione a R Enrico Properzi - enrico.properzi3@unibo.itenrico.properzi3@unibo.it A.A. 2010/2011.

Un altro comando utile per cercare elementi all’interno di un vettore è which. Se, ad esempioo, vogliamo sapere quali sono gli indici corrispondenti agli elementi del vettore x minori di 2, scriveremo:

> which (x<2)[1] 1 2 3 4 5

oppure quelli compresi tra -1 e 5:

> which ((x>=-1) &(x<5))[1] 3 4 5 6 7 8

o quelli più grandi di 1 o più piccoli di -2:

> which ((x < -2)|(x>1))[1] 1 6 7 8 9 10 11 12

Page 15: 1. Introduzione a R Enrico Properzi - enrico.properzi3@unibo.itenrico.properzi3@unibo.it A.A. 2010/2011.

Una matrice e un insieme di elementi dello stesso tipo con due dimensioni. Il comando per generare una matrice è:

A <- matrix(x, nrow = n, ncol = m, byrow = ...)

dove:• x è un vettore di dati;• nrow e ncol sono, rispettivamente il numero di righe e di colonne • byrow e un operatore logico. Di default e FALSE, per cui la matrice viene costruita per colonna

> A <- matrix (11:16, 3,2)> A [,1] [,2][1,] 11 14[2,] 12 15[3,] 13 16

Matrice trasposta

> t(A) [,1] [,2] [,3][1,] 11 12 13[2,] 14 15 16

MATRICI

> sum(A)[1] 81

> length(A)[1] 6

> nrow(A)[1] 3

> ncol(A)[1] 2

Page 16: 1. Introduzione a R Enrico Properzi - enrico.properzi3@unibo.itenrico.properzi3@unibo.it A.A. 2010/2011.

Una matrice può anche essere generata unendo più vettori o matrici. I comandi cbind e rbind, rispettivamente, generano una matrice unendo ivettori (le matrici) per colonna e per riga.

> x <- c(1, 2, 3, 4)> y <- c(2, 1, 4, 5)

> cbind(x,y) x y[1,] 1 2[2,] 2 1[3,] 3 4[4,] 4 5

> rbind(x,y) [,1] [,2] [,3] [,4]x 1 2 3 4y 2 1 4 5

Le matrici possono essere numeriche, di stringhe di caratteri o logiche

Page 17: 1. Introduzione a R Enrico Properzi - enrico.properzi3@unibo.itenrico.properzi3@unibo.it A.A. 2010/2011.

Indicizzazione:

> A [,1] [,2][1,] 11 14[2,] 12 15[3,] 13 16

Voglio selezionare solo alcuni elementi di interesse dalla matrice A:

> A[1,2][1] 14 (Ho selezionato l’elemento della prima riga e seconda

colonna)

> A[1,][1] 11 14 (Ho selezionato tutti gli elementi della prima riga)

> A[,2][1] 14 15 16 (Ho selezionato tutti gli elementi della seconda

colonna)

> A==11 [,1] [,2][1,] TRUE FALSE[2,] FALSE FALSE[3,] FALSE FALSE (Ho creato una matrice logica)

Page 18: 1. Introduzione a R Enrico Properzi - enrico.properzi3@unibo.itenrico.properzi3@unibo.it A.A. 2010/2011.

Operazioni con le matrici:

> x <- matrix (4, 2, 3)> x [,1] [,2] [,3][1,] 4 4 4[2,] 4 4 4

Come per i vettori, anche per le matrici le operazioni aritmetiche e di confronto vengono eseguite elemento per elemento

> x+y [,1] [,2] [,3][1,] 5 7 9[2,] 6 8 10

> x*y [,1] [,2] [,3][1,] 4 12 20[2,] 8 16 24

N.B.: Per le operazioni elementari le matrici debbono avere le stesse dimensioni

> x-y [,1] [,2] [,3][1,] 3 1 -1[2,] 2 0 -2

> x/y [,1] [,2] [,3][1,] 4 1.333333 0.8000000[2,] 2 1.000000 0.6666667

> y <- matrix (1:6, ncol=3)> y [,1] [,2] [,3][1,] 1 3 5[2,] 2 4 6

Page 19: 1. Introduzione a R Enrico Properzi - enrico.properzi3@unibo.itenrico.properzi3@unibo.it A.A. 2010/2011.

> X <- matrix(4:13, ncol=2)> y <- matrix(1:6, nrow=2)

> x %*% y

[,1] [,2] [,3][1,] 22 48 74[2,] 25 55 85[3,] 28 62 96[4,] 31 69 107[5,] 34 76 118 (ho effettuato il prodotto tra due matrici)

> z <- t(x) %*% x> z [,1] [,2][1,] 190 340[2,] 340 615

solve(z) [,1] [,2][1,] 0.492 -0.272[2,] -0.272 0.152 il comando solve(z) consente di calcolare l’inversa di

una matrice quadrata non singolare

Page 20: 1. Introduzione a R Enrico Properzi - enrico.properzi3@unibo.itenrico.properzi3@unibo.it A.A. 2010/2011.

È possibile assegnare un nome alle righe ed alle colonne di una matrice con i comandi: rownames(), colnames(), dimnames()

> y [,1] [,2] [,3][1,] 1 3 5[2,] 2 4 6

> rownames(y) <- c("peso", "altezza")> y [,1] [,2] [,3]peso 1 3 5altezza 2 4 6

> colnames (y) <- c("a", "b", "c")> y a b cpeso 1 3 5altezza 2 4 6

Page 21: 1. Introduzione a R Enrico Properzi - enrico.properzi3@unibo.itenrico.properzi3@unibo.it A.A. 2010/2011.

Così come le matrici possono intendersi come estensioni deivettori, gli array costituiscono una estensione delle matrici.Sono necessari tre indici per definire un array

> z <- array(1:16,dim=c(2,3,2))> z In questo caso z è composto da 2

matrici 2x3 , , 1

[,1] [,2] [,3][1,] 1 3 5[2,] 2 4 6 Questa è la prima matrice

, , 2

[,1] [,2] [,3][1,] 7 9 11[2,] 8 10 12 Questa è la seconda matrice

Page 22: 1. Introduzione a R Enrico Properzi - enrico.properzi3@unibo.itenrico.properzi3@unibo.it A.A. 2010/2011.

Estrazione dell’elemento sulla prima riga e terza colonna della prima matrice:

> z[1,3,1][1] 5

Estrazione di tutti gli elementi della seconda colonna della seconda matrice:

> z[,2,2][1] 9 10

Page 23: 1. Introduzione a R Enrico Properzi - enrico.properzi3@unibo.itenrico.properzi3@unibo.it A.A. 2010/2011.

Una lista è un contenitore generico in cui è possibile inserire vettori di vario tipo.

> lista <- list(1:3, "pippo", matrix(1:4,2))> lista[[1]][1] 1 2 3

[[2]][1] "pippo"

[[3]] [,1] [,2][1,] 1 3[2,] 2 4

Ho creato una lista di 3 elementi di tipo diverso

Page 24: 1. Introduzione a R Enrico Properzi - enrico.properzi3@unibo.itenrico.properzi3@unibo.it A.A. 2010/2011.

Indicizzazione:

Gli elementi di una lista si estraggono con le doppie parentesi quadre [[..]]Gli elementi di una lista possono essere identificati con nomi univociSe un elemento di una lista ha un nome, può essere indicato con la sintassi: nomelista$nomeelemento

> lista <- list(primo=1:3, secondo="pippo", terzo=matrix(1:4,2))

> lista[["terzo"]] [,1] [,2][1,] 1 3[2,] 2 4

> lista$quarto <- 0

> names(lista)[1] "primo" "secondo" "terzo" "quarto"

> lista$terzo [,1] [,2][1,] 1 3[2,] 2 4

Page 25: 1. Introduzione a R Enrico Properzi - enrico.properzi3@unibo.itenrico.properzi3@unibo.it A.A. 2010/2011.

Matrici e array possono essere nominati facendo uso di liste:

Se consideriamo una matrice, può essere utile assegnare dei nomi alle righe e alle colonne; questa operazione viene effettuata utilizzando liste di nomi in cui ciascuna componente si riferisce ad una dimensione:

> A <- matrix (1:20, nrow=4)

> dimnames(A)<-list(c("PRIMO","SECONDO", "TERZO", "QUARTO"),NULL)> A [,1] [,2] [,3] [,4] [,5]PRIMO 1 5 9 13 17SECONDO 2 6 10 14 18TERZO 3 7 11 15 19QUARTO 4 8 12 16 20

In questo modo vengono assegnati i nomi soltanto alle righe

Page 26: 1. Introduzione a R Enrico Properzi - enrico.properzi3@unibo.itenrico.properzi3@unibo.it A.A. 2010/2011.

I data-frame sono delle matrici in cui le colonne possono essere di natura differente

È un oggetto di particolare importanza in un’ottica di gestione e analisi dei dati.

Il data frame rappresenta infatti la matrice dei dati in cui ad ogni riga corrisponde una osservazione e ad ogni colonna una variabile

Viene trattato come una lista ed ogni elemento di tale lista rappresenta una variabile statistica

Il comando per generare un data frame è data.frame

Page 27: 1. Introduzione a R Enrico Properzi - enrico.properzi3@unibo.itenrico.properzi3@unibo.it A.A. 2010/2011.

Voglio creare un dataframe con una variabile `quantitativa' ed unaqualitativa':

> D <-data.frame(eta=21:24, sesso=c("M","F","F","M"))> D eta sesso1 21 M2 22 F3 23 F4 24 M

> dim(D) indica la `dimensione' (numero dei casi e di variabili)[1] 4 2

> D$altezza <- c(175, 164, 170, 182)

> D eta sesso altezza1 21 M 1752 22 F 1643 23 F 1704 24 M 182

Ho aggiunto una variabile di nome altezza

Page 28: 1. Introduzione a R Enrico Properzi - enrico.properzi3@unibo.itenrico.properzi3@unibo.it A.A. 2010/2011.

Nelle applicazioni µe spesso utile selezionare soltanto una parte del dataframe iniziale:

> D[D$sesso=="M","eta"][1] 21 24 seleziona i valori della variabile eta per i maschi:

> D$sesso[D$eta<=23][1] M F F seleziona i valori della variabile sesso per cui

eta<=23:Levels: F M

> D$altezza[D$eta<=25 & D$eta>23][1] 182

seleziona i valori di "altezza" se eta<=25 e eta>23

Sostanzialmente la condizione di selezione dei record µe un vettore logico (ottenuto combinando altri vettori logici) che quando utilizzato come filtro fa in modo che solo gli elementi in corrispondenza di TRUE vengano selezionati.

Page 29: 1. Introduzione a R Enrico Properzi - enrico.properzi3@unibo.itenrico.properzi3@unibo.it A.A. 2010/2011.

Costruiamo la matrice voti con 2 colonne contenente interi casuali compresi tra 18 e 30, utilizzando il comando sample:

voti <- matrix((sample(18:30,8,replace=TRUE)),nrow=4)

E ora creiamo un nuovo data frame:> D <- data.frame(D,Voti=voti) (o, in alternativa: D$Voti <- voti)> D eta sesso altezza Voti.1 Voti.21 21 M 175 29 272 22 F 164 22 223 23 F 170 24 204 24 M 182 23 24

> D1 <- data.frame (eta=D$eta, sesso=D$sesso, voti=voti)> D1 eta sesso voti.1 voti.21 21 M 29 272 22 F 22 223 23 F 24 204 24 M 23 24

Page 30: 1. Introduzione a R Enrico Properzi - enrico.properzi3@unibo.itenrico.properzi3@unibo.it A.A. 2010/2011.

Per selezionare parti di un data-frame si può anche utilizzare la funzione subset(), in cui gli argomenti subset e select specificano rispettivamente i casi e le variabili da includere (o escludere).

> subset(D,subset=(sesso=="F" & altezza >=170),select=c(Voti.1,Voti.2)) Voti.1 Voti.23 24 20

> subset(D,subset=(sesso=="F" & altezza >=170), select=c(-sesso)) eta altezza Voti.1 Voti.23 23 170 24 20

Page 31: 1. Introduzione a R Enrico Properzi - enrico.properzi3@unibo.itenrico.properzi3@unibo.it A.A. 2010/2011.

Per avere una descrizione del data frame si possono usare i comandi str() e summary()

> str(D)'data.frame': 4 obs. of 5 variables: $ eta : int 21 22 23 24 $ sesso : Factor w/ 2 levels "F","M": 2 1 1 2 $ altezza: num 175 164 170 182 $ Voti.1 : int 29 22 24 23 $ Voti.2 : int 27 22 20 24

> summary(D) eta sesso altezza Voti.1 Voti.2 Min. :21.00 F:2 Min. :164.0 Min. :22.00 Min. :20.00 1st Qu.:21.75 M:2 1st Qu.:168.5 1st Qu.:22.75 1st Qu.:21.50 Median :22.50 Median :172.5 Median :23.50 Median :23.00 Mean :22.50 Mean :172.8 Mean :24.50 Mean :23.25 3rd Qu.:23.25 3rd Qu.:176.8 3rd Qu.:25.25 3rd Qu.:24.75 Max. :24.00 Max. :182.0 Max. :29.00 Max. :27.00

Page 32: 1. Introduzione a R Enrico Properzi - enrico.properzi3@unibo.itenrico.properzi3@unibo.it A.A. 2010/2011.

In R è possibile leggere dati da diversi formati: file di testo (txt o csv) S-PLUS, SAS, SPSS, Stata, Systat pagine web database esterni

N.B.: per importare dati in formati diversi da quello testo è necessario usare appositi pacchetti.

Informazioni dettagliate si possono trovare nel manuale “Data Import/Export”, accessibile da menu

File di testo:Uno dei formati più semplici contiene i nomi nella prima riga, ed i dati nelle righe successive, con i campi separati da spazi:

X <- read.table(file="c:/documenti/salary.txt“, header=TRUE)

A volte le colonne sono separate da tabulazioni o virgole:

X <- read.table(file="c:/documenti/salary.txt“, header=TRUE, sep=“,”)

Page 33: 1. Introduzione a R Enrico Properzi - enrico.properzi3@unibo.itenrico.properzi3@unibo.it A.A. 2010/2011.

Opzioni del comando read.table()

il percorso del file viene scritto come negli ambienti Unix (o Linux) con /, oppure con \\;

l'argomento header=TRUE specifica che la prima linea del file contiene i nomi delle variabili;

l'argomento sep="\t" indica che i diversi campi sono separati da un tab. Avremmo potuto specificare sep="," nel caso di una virgola e così via;

l'argomento na.strings="NA" può essere particolarmente utile se nel file sono presenti valori mancanti, in questo caso individuati con NA;

l'argomento dec="." specifica il tipo di carattere utilizzato nel file per separare i decimali, in questo caso un punto

È possibile importare direttamente anche file in formato .csv (creati ad esempio da Excel). Il comando da utilizzare è read.csv(), che ha una sintassi simile a quella appena vista.

Page 34: 1. Introduzione a R Enrico Properzi - enrico.properzi3@unibo.itenrico.properzi3@unibo.it A.A. 2010/2011.

Molte funzioni di R vivono in ”pacchetti” opzionali.

Il comandolibrary() carica i pacchetti dalla libreria dei pacchetti:

> library(nomepacchetto)

In alternativa, dal menù "Pacchetti" si sceglie l'opzione "Carica pacchetto": Si apre una finestra con la lista dei pacchetti già installati tra cui scegliere quale caricare

Per installare un pacchetto non presente nella versione di R, dal menù "Pacchetti" si seleziona "Installa pacchetti". Viene quindi mostrato l’elenco dei mirror tra cui selezionare quello da cui scaricare il pacchetto. Dalla lista si seleziona il pacchetto da installare

Page 35: 1. Introduzione a R Enrico Properzi - enrico.properzi3@unibo.itenrico.properzi3@unibo.it A.A. 2010/2011.

Il pacchetto foreign è nella distribuzione standard di R. Contiene funzioni per gestire l’importazione e l’esportazione dei dati.

Più di 1000 pacchetti sono disponibili su http://cran.us.r-project.org (e decine di mirror sparsi per il

mondo: il CRAN).

Per verificare i pacchetti disponibili si può utilizzare il comando:

> .packages(all.available = TRUE)[1] "abind" "acepack" "AER" "akima"[5] "ape" "aplpack" "base" "biglm"[9] "bitops" "boot" "car" "caTools"[13] "chron" "class" "cluster" . . . . .

Mentre per elencare i pacchetti caricati utilizzare il comando:> (.packages())[1] "stats" "graphics" "grDevices" "utils" "datasets" "methods"[7] "base"