1 R

1.1 Γενικά

Η R είναι μια σύγχρονη γλώσσα προγραμματισμού η οποία σχεδιάστηκε και χρησιμοποιείται παγκοσμίως σε ακαδημαϊκό και επιχειρησιακό επίπεδο καθώς προσφέρει αυξημένες δυνατότητες υπολογιστικής ανάλυσης. Η ανάπτυξη και διάδοση της στηρίζεται στην δυνατότητα ανάπτυξης και διάθεσης πρόσθετων βιβλιοθηκών οι οποίες προσφέρουν επιπρόσθετες λειτουργίες και δυνατότητες.

Έτσι κάθε επιστημονικό πεδίο έχει την δυνατότητα να προσφέρει εξειδικευμένες μεθόδους στο κεντρικό αποθετήριο βιβλιοθηκών της R το οποίο ονομάζεται: CRAN, επεκτείνοντας έτσι τις δυνατότητες της. Η εξειδίκευση της γλώσσα προγραμματισμού R έχει λάβει μεγάλες διαστάσεις και μπορεί να ασχοληθεί με μια πληθώρα επιστημονικών προβλημάτων και εφαρμογών.

1.2 Ιστορικά

  • Εμφάνιση: 1993
  • Σχεδιασμός: Ross Ihaka και Robert Gentleman
  • Ανάπτυξη: R Development Core Team
  • Πλατφόρμα: Cross-platform
  • Άδεια: GNU General Public Licence
  • Ιστοσελίδα: http://www.r-project.org
  • Έκδοση: 3.1.2 / 31-Οκτ-2014

1.3 Εγκατάσταση

Η εγκατάσταση της R είναι απλή, εκτελώντας τις οδηγίες στους ακόλουθους συνδέσμους:

1.4 Βοήθεια

1.5 RStudio

  • Γραφικό περιβάλλον ανάπτυξης (IDE) με αυξημένες δυνατότητες: επεξεργασίας, ανάπτυξης, version-control, I/O.
  • Ανάπτυξη: RStudio, Inc.
  • Πλατφόρμα: Cross-platform
  • Άδεια: GNU Affero General Public License v3
  • Ιστοσελίδα: http://rstudio.org/
  • Έκδοση: 0.98.1091 / 6-Νοε-2014

1.6 Rtools

Στα Windows θα χρειαστεί επιπλέον να εγκαταστήσουμε και το εργαλείο: RTools το οποίο βοηθάει στην εγκατάσταση και στο compile κάποιων βιβλιοθηκών.

https://cran.r-project.org/bin/windows/Rtools/

1.7 Βιβλιοθήκες

Η γλώσσα R μπορεί να επεκταθεί χρησιμοποιώντας επιπλέων βιβλιοθήκες τις οποίες χρειάζεται να κατεβάσουμε μόνο μια φορά. Στη συνέχεια αφού έχουμε κατεβάσει κάποια βιβλιοθήκη, μπορούμε να την φορτώσουμε με την εντολή library("OnomaBibliothikis").

2 Δεδομένα

2.1 Μεταβλητές

Ορισμός μεταβλητών και πράξεις μεταξύ τους:

x=5
y=10
x+y
[1] 15
x/y
[1] 0.5
x-y
[1] -5
x*y
[1] 50

Παραγωγή δεδομένων ακέραιων αριθμών (integer)

1:10
 [1]  1  2  3  4  5  6  7  8  9 10
rep(34,5)
[1] 34 34 34 34 34
seq(0, 10, 2)
[1]  0  2  4  6  8 10

2.2 Διάνυσμα

Ορισμός διανυσμάτων (vector) και πράξεις στα στοιχεία τους:

age = c(22,24,26,30,21)
car = c(1,1,0,0,2)
education = c(3,3,3,2,3)
height = c(180,185,190,183,192)

Πράξεις σε ένα vector

age * 2
[1] 44 48 52 60 42
age + 200
[1] 222 224 226 230 221

Πράξεις μεταξύ vector

age * car
[1] 22 24  0  0 42
age + car
[1] 23 25 26 30 23

Επιλογή στοιχείων

st = c("aa", "bb", "cc", "dd", "ee") 
st[2]
[1] "bb"
st[1:3]
[1] "aa" "bb" "cc"
st[c(1,3,5)]
[1] "aa" "cc" "ee"
st[-2]
[1] "aa" "cc" "dd" "ee"

Μέσος όρος vector

mean(age)
[1] 24.6

Πλήθος vector

length(age)
[1] 5

2.3 data.frame

Ορισμός πλαίσιου δεδομένων (data.frame), ανάκληση στηλών και περιγραφικά στοιχεία του data.frame:

mydata = data.frame(height, age, car, education)
mydata
  height age car education
1    180  22   1         3
2    185  24   1         3
3    190  26   0         3
4    183  30   0         2
5    192  21   2         3

5 πρώτες γραμμές

head(mydata)
  height age car education
1    180  22   1         3
2    185  24   1         3
3    190  26   0         3
4    183  30   0         2
5    192  21   2         3

Περίληψη των δεδομένων στο data.frame

summary(mydata)
     height         age            car        education  
 Min.   :180   Min.   :21.0   Min.   :0.0   Min.   :2.0  
 1st Qu.:183   1st Qu.:22.0   1st Qu.:0.0   1st Qu.:3.0  
 Median :185   Median :24.0   Median :1.0   Median :3.0  
 Mean   :186   Mean   :24.6   Mean   :0.8   Mean   :2.8  
 3rd Qu.:190   3rd Qu.:26.0   3rd Qu.:1.0   3rd Qu.:3.0  
 Max.   :192   Max.   :30.0   Max.   :2.0   Max.   :3.0  

Μέγεθος του data.frame

dim(mydata)
[1] 5 4

Ονόματα των στηλών του data.frame

names(mydata)
[1] "height"    "age"       "car"       "education"

Επιλογή στηλών

mydata$age
[1] 22 24 26 30 21
mydata$car
[1] 1 1 0 0 2

Πράξεις στηλών

sum(mydata$age)
[1] 123
max(mydata$car)
[1] 2

Πλήθος στηλών και γραμμών

nrow(mydata)
[1] 5
ncol(mydata)
[1] 4

2.4 Λίστα

Μια λίστα (list) μπορεί να περιλαμβάνει πλήθος ετερόκλητων στοιχείων όπως: αριθμούς ή/και κείμενο:

mylist=list(height, mydata, "Καλημέρα", "2251036404")
mylist
[[1]]
[1] 180 185 190 183 192

[[2]]
  height age car education
1    180  22   1         3
2    185  24   1         3
3    190  26   0         3
4    183  30   0         2
5    192  21   2         3

[[3]]
[1] "Καλημέρα"

[[4]]
[1] "2251036404"
mylist[1]
[[1]]
[1] 180 185 190 183 192
mylist[1:2]
[[1]]
[1] 180 185 190 183 192

[[2]]
  height age car education
1    180  22   1         3
2    185  24   1         3
3    190  26   0         3
4    183  30   0         2
5    192  21   2         3

2.5 Βασικές συναρτήσεις

Το βασικό πακέτο της R (ονομάζεται: R-Base) περιλαμβάνει γενικές συναρτήσεις οι οποίες είναι άμεσα διαθέσιμες και μπορούν να εφαρμοστούν σε ένα πλήθος τύπων δεδομένων (vector, data.frame, matrix, κτλ):

summary(mydata$age)
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
   21.0    22.0    24.0    24.6    26.0    30.0 
mydata$age
[1] 22 24 26 30 21
min(mydata$age)
[1] 21
max(mydata$age)
[1] 30
mean(mydata$age)
[1] 24.6
median(mydata$age)
[1] 24
length(mydata$age)
[1] 5
mode(mydata$age)
[1] "numeric"

2.6 Αναζήτηση βοήθειας

Για να πάρουμε βοήθεια σχετικά με την χρήση και τα χαρακτηριστικά μιας συνάρτησης, μπορούμε να καλέσουμε την ακόλουθη εντολή:

help( "summary" ) 
?summary

2.7 Δομές ροής

Η δομή for επαναλαμβάνει μια σειρά από κώδικα επανειλημμένα εντός ενός ορίου που θέτει ο χρήστης:

x=c(1:10)

for (i in x){
  print( i )
}
[1] 1
[1] 2
[1] 3
[1] 4
[1] 5
[1] 6
[1] 7
[1] 8
[1] 9
[1] 10
for (k in 1:10){
  print( x[k] )
}
[1] 1
[1] 2
[1] 3
[1] 4
[1] 5
[1] 6
[1] 7
[1] 8
[1] 9
[1] 10
for (p in seq(from=10,to=20,by=2)){
  print( p )
}
[1] 10
[1] 12
[1] 14
[1] 16
[1] 18
[1] 20

Δοκιμάστε να κάνετε το ίδιο αυξάνοντας συνεχώς το όρισμα by:

for (p in seq(from=10,to=20,by=4)){
  print( p )
}
[1] 10
[1] 14
[1] 18

Η δομή ροής if κάνει λογικό έλεγχο:

y = 15
if (y > 0){
  print("Μεγαλύτερο")
} else {
  print("Μικρότερο")
}
[1] "Μεγαλύτερο"

Η δομή if μπορεί να συνδυαστεί και με την δομή else για την διαχείριση περισσότερων ενδεχόμενων καταστάσεων:

for (m in seq(1:10)){
  print(m)
  if (m < 6){
    print("Μικρότερο ή ίσο με 6")
  } else {
    print("Μεγαλύτερο του 6")
  }
}
[1] 1
[1] "Μικρότερο ή ίσο με 6"
[1] 2
[1] "Μικρότερο ή ίσο με 6"
[1] 3
[1] "Μικρότερο ή ίσο με 6"
[1] 4
[1] "Μικρότερο ή ίσο με 6"
[1] 5
[1] "Μικρότερο ή ίσο με 6"
[1] 6
[1] "Μεγαλύτερο του 6"
[1] 7
[1] "Μεγαλύτερο του 6"
[1] 8
[1] "Μεγαλύτερο του 6"
[1] 9
[1] "Μεγαλύτερο του 6"
[1] 10
[1] "Μεγαλύτερο του 6"

Κατασκευή μεθόδων

x=1:10
kalimera = function(enavector){
  return(enavector * 2)
}

kalimera(x)
 [1]  2  4  6  8 10 12 14 16 18 20

2.8 Αποθήκευση δεδομένων

Ένα βασικό στοιχείο σε κάθε γλώσσα προγραμματισμού είναι οι δυνατότητες εισαγωγής και εξαγωγής δεδομένων (Ι/Ο). Η R μπορεί αν προσπελάσει μια πληθώρα από είδη αρχείων και να ανακτήσει τις πληροφορίες που είναι αποθηκευμένες σε αυτά. Τα είδη των αρχείων που μπορούν να ανακτηθούν ποικίλουν από απλά ASCII αρχεία τα οποία περιλαμβάνουν αλφαριθμητικούς χαρακτήρες (κείμενο) έως και τα πλέον σύνθετα και εξειδικευμένα είδη αρχείων.

myt = read.table("Data/mydata.csv", header = T, sep = ",")
myt
   onoma    sex emails experience
1 George   Male      6         15
2   Mary Female      9         16
3  Helen Female      6         12
4 Kostas   Male      8         16
5    Luc   Male     12         17
6   John   Male      4         10
7 Mathew   Male      5         10
write.table(myt, "Data/people.csv", row.names = F, sep=",")

3 Γραφήματα

Ιστόγραμμα (Histogram)

hist(myt$experience, breaks=5)

hist(myt$experience, breaks=10, main="With 10 bars")

Boxplot

boxplot(myt$emails)

boxplot(myt$experience, horizontal=T)

Διασποροδιάγραμμα (Scaterplot)

plot(myt$emails)

plot(myt$emails, myt$experience, main="Relationship between emails and\nyears of experience")

cor(myt$emails, myt$experience)
[1] 0.863756

Dotplot

dotchart(myt$emails,labels=myt$onoma, main="Emails per person", xlab="Emails")

Διατεταγμένο Dotplot με κατηγορίες

x = myt[order(myt$emails),] # sort by emails
x$sex = factor(x$sex) # it must be a factor
x$color[x$sex=="Male"] = "red"
x$color[x$sex=="Female"] = "blue"
dotchart(x$emails,labels=x$onoma,cex=.7, groups= x$sex,main="Emails per person\ngrouped by sex",xlab="emails", color=x$color) 

plot(myt$emails )

plot(myt$emails, myt$experience )

plot(myt$emails, myt$experience, col=as.factor(myt$sex), pch=19 )
legend("topleft", legend =unique(myt$sex), fill = unique( as.factor(myt$sex)), cex=1 )

boxplot(myt$emails )

boxplot(emails~sex, data = myt, col=c( "cyan","orange"))

pie(table(myt$sex ))

4 Περιγραφική Στατιστική

library(datasets)
data(iris)
df2=iris

επισκόπηση

head(df2)
  Sepal.Length Sepal.Width Petal.Length Petal.Width Species
1          5.1         3.5          1.4         0.2  setosa
2          4.9         3.0          1.4         0.2  setosa
3          4.7         3.2          1.3         0.2  setosa
4          4.6         3.1          1.5         0.2  setosa
5          5.0         3.6          1.4         0.2  setosa
6          5.4         3.9          1.7         0.4  setosa
summary(df2)
  Sepal.Length    Sepal.Width     Petal.Length    Petal.Width          Species  
 Min.   :4.300   Min.   :2.000   Min.   :1.000   Min.   :0.100   setosa    :50  
 1st Qu.:5.100   1st Qu.:2.800   1st Qu.:1.600   1st Qu.:0.300   versicolor:50  
 Median :5.800   Median :3.000   Median :4.350   Median :1.300   virginica :50  
 Mean   :5.843   Mean   :3.057   Mean   :3.758   Mean   :1.199                  
 3rd Qu.:6.400   3rd Qu.:3.300   3rd Qu.:5.100   3rd Qu.:1.800                  
 Max.   :7.900   Max.   :4.400   Max.   :6.900   Max.   :2.500                  
table(df2$Species)

    setosa versicolor  virginica 
        50         50         50 

4.1 Μέτρα κεντρικής τάσης

mean(df2$Sepal.Length)
[1] 5.843333
median(df2$Sepal.Length)
[1] 5.8

4.2 Μέτρα Μεταβλητότητας

min(df2$Sepal.Length)
[1] 4.3
which.min(df2$Sepal.Length)
[1] 14
max(df2$Sepal.Length)
[1] 7.9
max(df2$Sepal.Length) - min(df2$Sepal.Length)
[1] 3.6
range(df2$Sepal.Length)
[1] 4.3 7.9
quantile(df2$Sepal.Length)
  0%  25%  50%  75% 100% 
 4.3  5.1  5.8  6.4  7.9 
quantile(df2$Sepal.Length, seq(0, 1, 0.1))
  0%  10%  20%  30%  40%  50%  60%  70%  80%  90% 100% 
4.30 4.80 5.00 5.27 5.60 5.80 6.10 6.30 6.52 6.90 7.90 
IQR(df2$Sepal.Length)
[1] 1.3
median(df2$Sepal.Length)
[1] 5.8
mad(df2$Sepal.Length) # Median Absolute Deviation
[1] 1.03782
quantile(df2$Sepal.Length )
  0%  25%  50%  75% 100% 
 4.3  5.1  5.8  6.4  7.9 
var(df2$Sepal.Length) # διασπορά
[1] 0.6856935
sd(df2$Sepal.Length) # τυπική απόκληση
[1] 0.8280661

Συντελεστής μεταβλητότητα

mycv = function(x) {
  return( sd(x) / mean(x) ) 
}
mycv(df2$Sepal.Length)
[1] 0.1417113

4.3 Περιλήψεις

summary(df2$Sepal.Length)
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
  4.300   5.100   5.800   5.843   6.400   7.900 
summary(df2, digits = 1)
  Sepal.Length  Sepal.Width  Petal.Length  Petal.Width        Species  
 Min.   :4     Min.   :2    Min.   :1     Min.   :0.1   setosa    :50  
 1st Qu.:5     1st Qu.:3    1st Qu.:2     1st Qu.:0.3   versicolor:50  
 Median :6     Median :3    Median :4     Median :1.3   virginica :50  
 Mean   :6     Mean   :3    Mean   :4     Mean   :1.2                  
 3rd Qu.:6     3rd Qu.:3    3rd Qu.:5     3rd Qu.:1.8                  
 Max.   :8     Max.   :4    Max.   :7     Max.   :2.5                  
sapply(df2[, -5], mean) # Mean by column
Sepal.Length  Sepal.Width Petal.Length  Petal.Width 
    5.843333     3.057333     3.758000     1.199333 
sapply(df2[, -5], quantile) # Quartiles
     Sepal.Length Sepal.Width Petal.Length Petal.Width
0%            4.3         2.0         1.00         0.1
25%           5.1         2.8         1.60         0.3
50%           5.8         3.0         4.35         1.3
75%           6.4         3.3         5.10         1.8
100%          7.9         4.4         6.90         2.5

4.4 Στατιστικά ανά ομάδες

library("dplyr")

df2 %>% group_by(Species) %>% 
  summarise(
    count = n(), 
    mean = mean(Sepal.Length, na.rm = TRUE),
    sd = sd(Sepal.Length, na.rm = TRUE)
  )
# A tibble: 3 × 4
  Species    count  mean    sd
  <fct>      <int> <dbl> <dbl>
1 setosa        50  5.01 0.352
2 versicolor    50  5.94 0.516
3 virginica     50  6.59 0.636
library("ggpubr")

Box plot colored by groups: Species

ggboxplot(df2, x = "Species", y = "Sepal.Length",
          color = "Species",
          palette = c("#00AFBB", "#E7B800", "#FC4E07"))

Stripchart colored by groups: Species

ggstripchart(df2, x = "Species", y = "Sepal.Length",
             color = "Species",
             palette = c("#00AFBB", "#E7B800", "#FC4E07"),
             add = "mean_sd")

4.5 Συχνότητες

df3 = as.data.frame(HairEyeColor)
hair_eye_col = df3[rep(row.names(df3), df3$Freq), 1:3]
rownames(hair_eye_col) = 1:nrow(hair_eye_col)
head(hair_eye_col)
   Hair   Eye  Sex
1 Black Brown Male
2 Black Brown Male
3 Black Brown Male
4 Black Brown Male
5 Black Brown Male
6 Black Brown Male

hair/eye variables

Hair = hair_eye_col$Hair
Eye = hair_eye_col$Eye

Frequency distribution of hair color

table(Hair)
Hair
Black Brown   Red Blond 
  108   286    71   127 

Frequency distribution of eye color

table(Eye)
Eye
Brown  Blue Hazel Green 
  220   215    93    64 

4.6 Πίνακας διπλής εισόδου

2 κατηγορικές μεταβλητές

tbl2 = table(Hair , Eye)
tbl2
       Eye
Hair    Brown Blue Hazel Green
  Black    68   20    15     5
  Brown   119   84    54    29
  Red      26   17    14    14
  Blond     7   94    10    16
xtabs(~ Hair + Eye, data = hair_eye_col)
       Eye
Hair    Brown Blue Hazel Green
  Black    68   20    15     5
  Brown   119   84    54    29
  Red      26   17    14    14
  Blond     7   94    10    16
df4 = as.data.frame(tbl2)
head(df4)
   Hair   Eye Freq
1 Black Brown   68
2 Brown Brown  119
3   Red Brown   26
4 Blond Brown    7
5 Black  Blue   20
6 Brown  Blue   84

Οπτικοποίηση με bar plot

library(ggpubr)
ggbarplot(df4, x = "Hair", y = "Freq",
          color = "Eye", 
          palette = c("brown", "blue", "gold", "green"))

position dodge

ggbarplot(df4, x = "Hair", y = "Freq",
          color = "Eye", position = position_dodge(),
          palette = c("brown", "blue", "gold", "green"))

4.7 Συχνότητες Β’ μέρος

Hair = hair_eye_col$Hair
Eye = hair_eye_col$Eye
# Hair/Eye color table
he.tbl = table(Hair, Eye)
he.tbl
       Eye
Hair    Brown Blue Hazel Green
  Black    68   20    15     5
  Brown   119   84    54    29
  Red      26   17    14    14
  Blond     7   94    10    16

margin: index number (1 γραμμές και 2 για στήλες)

Margin of rows

margin.table(he.tbl, 1)
Hair
Black Brown   Red Blond 
  108   286    71   127 

Margin of columns

margin.table(he.tbl, 2)
Eye
Brown  Blue Hazel Green 
  220   215    93    64 

Σχετικές συχνότητες: Frequencies relative to row total

prop.table(he.tbl, 1)
       Eye
Hair         Brown       Blue      Hazel      Green
  Black 0.62962963 0.18518519 0.13888889 0.04629630
  Brown 0.41608392 0.29370629 0.18881119 0.10139860
  Red   0.36619718 0.23943662 0.19718310 0.19718310
  Blond 0.05511811 0.74015748 0.07874016 0.12598425

Table of percentages

round(prop.table(he.tbl, 1), 2)*100
       Eye
Hair    Brown Blue Hazel Green
  Black    63   19    14     5
  Brown    42   29    19    10
  Red      37   24    20    20
  Blond     6   74     8    13

Express the frequencies relative to the grand total:

he.tbl/sum(he.tbl) * 100
       Eye
Hair         Brown       Blue      Hazel      Green
  Black 11.4864865  3.3783784  2.5337838  0.8445946
  Brown 20.1013514 14.1891892  9.1216216  4.8986486
  Red    4.3918919  2.8716216  2.3648649  2.3648649
  Blond  1.1824324 15.8783784  1.6891892  2.7027027

4.8 Γραμμική Παλινδρόμηση

library(readxl)
df5 = read_excel("Data/Data.xls")

df5
# A tibble: 11 × 3
     ena   duo  tria
   <dbl> <dbl> <dbl>
 1    10   100  0.2 
 2    11   109  0.12
 3     8    91  0.07
 4     9    98  0.06
 5    13   123  0.17
 6     5    70  0.06
 7    13   144  0.6 
 8    12   119  0.2 
 9    11   117  0.11
10    12   119  0.11
11    17   150  0.18

Boxplot

library(ggplot2)
ggplot(stack(df5), aes(x = ind, y = values)) + geom_boxplot()

model1 = lm(ena ~ duo+tria  , data=df5)  # build linear regression model on full data
print(summary(model1))

Call:
lm(formula = ena ~ duo + tria, data = df5)

Residuals:
     Min       1Q   Median       3Q      Max 
-0.98460 -0.32607 -0.09558  0.32939  1.09888 

Coefficients:
            Estimate Std. Error t value Pr(>|t|)    
(Intercept) -5.24388    1.09520  -4.788  0.00138 ** 
duo          0.15240    0.01093  13.948 6.76e-07 ***
tria        -5.47442    1.64995  -3.318  0.01057 *  
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Residual standard error: 0.6204 on 8 degrees of freedom
Multiple R-squared:  0.9679,    Adjusted R-squared:  0.9599 
F-statistic: 120.7 on 2 and 8 DF,  p-value: 1.059e-06
# ena = -5.2 + (0.15 * duo) + (-5.47 * tria)

par(mfrow=c(2,2)) # Change the panel layout to 2 x 2
plot(model1)

par(mfrow=c(1,1)) # Change back to 1 x 1

plot(df5$ena, df5$duo)
abline(lm(df5$duo ~ df5$ena), col="blue", lwd=2)

4.9 Διαγνωστικά

library(tidyverse)
library(broom)
model.diag.metrics = augment(model1)
head(model.diag.metrics)
# A tibble: 6 × 9
    ena   duo  tria .fitted  .resid  .hat .sigma .cooksd .std.resid
  <dbl> <dbl> <dbl>   <dbl>   <dbl> <dbl>  <dbl>   <dbl>      <dbl>
1    10   100  0.2     8.90  1.10   0.169  0.482 0.255        1.94 
2    11   109  0.12   10.7   0.289  0.102  0.653 0.00922      0.492
3     8    91  0.07    8.24 -0.241  0.182  0.656 0.0137      -0.430
4     9    98  0.06    9.36 -0.363  0.150  0.646 0.0237      -0.634
5    13   123  0.17   12.6   0.429  0.124  0.640 0.0259       0.740
6     5    70  0.06    5.10 -0.0956 0.468  0.661 0.0131      -0.211
library(ggfortify)
autoplot(model1)

library(jtools)
summ(model1)
Observations 11
Dependent variable ena
Type OLS linear regression
F(2,8) 120.70
0.97
Adj. R² 0.96
Est. S.E. t val. p
(Intercept) -5.24 1.10 -4.79 0.00
duo 0.15 0.01 13.95 0.00
tria -5.47 1.65 -3.32 0.01
Standard errors: OLS
summ(model1, confint = TRUE, digits =2) # confidence intervals
Observations 11
Dependent variable ena
Type OLS linear regression
F(2,8) 120.70
0.97
Adj. R² 0.96
Est. 2.5% 97.5% t val. p
(Intercept) -5.24 -7.77 -2.72 -4.79 0.00
duo 0.15 0.13 0.18 13.95 0.00
tria -5.47 -9.28 -1.67 -3.32 0.01
Standard errors: OLS
effect_plot(model1, pred = duo, interval = TRUE, plot.points = TRUE)

effect_plot(model1, pred = tria, interval = TRUE, plot.points = TRUE)

plot_summs(model1, scale = T)

plot_summs(model1, scale = TRUE, plot.distributions = TRUE, inner_ci_level = .9)

fit2 = lm(ena ~ duo, data =df5)
plot_summs(model1, fit2, scale = TRUE)

plot_summs(model1, fit2, scale = TRUE, plot.distributions = TRUE)

plot_summs(model1, model1, model1, scale = TRUE, robust = list(FALSE, "HC0", "HC3"),
           model.names = c("OLS", "HC0", "HC3"))

5 Γεωγραφικά Δεδομένα

Υπάρχει μια πληθώρα από βιβλιοθήκες που σχετίζονται με γεωγραφικά δεδομένα. Έχουν κατηγοριοποιηθεί και τυποποιηθεί από τον Roger Bivand και βρίσκονται στον ακόλουθο σύνδεσμο: http://cran.r-project.org/web/views/Spatial.html

  • Classes for spatial data
  • Handling spatial data
  • Reading and writing spatial data
  • Point pattern analysis
  • Geostatistics
  • Αreal data analysis
  • Spatial regression
  • Ecological analysis

5.1 Εισαγωγή χωρικών δεδομένων

Το αρχείο “Shapefiles/Lesvos” περιλαμβάνει δεδομένα για τις περιοχές της Λέσβου. Πριν εισάγουμε τα δεδομένα, φορτώνουμε τις απαραίτητες βιβλιοθήκες:

library(rgeos)
library(maptools)
library(rgdal)
le=rgdal::readOGR("Data/Lesvos.shp" )
OGR data source with driver: ESRI Shapefile 
Source: "/home/dimitrisk/working/Teaching/ΠΠΣ - Γεωγραφική Ανάλυση/Labs_2020/simple/00/Data/Lesvos.shp", layer: "Lesvos"
with 14 features
It has 7 fields
proj4string(le) = CRS("+init=epsg:2100") # Greek Grid: ΕΓΣΑ: Εθνικό Γεωδαιτικό Σύστημα Αναφοράς

Η μεταβλητή le είναι αντικείμενο (objet) της μορφής: SpatialPolygonDataFrame και περιλαμβάνει τα ακόλουθα ενθυλακωμένα αντικείμενα (encapsulated objects). Κάθε φορά που χειριζόμαστε ένα τέτοιο αντικείμενο, μπορούμε να έχουμε πρόσβαση και στα επιμέρους στοιχεία του τα οποία απεικονίζονται στην παραπάνω εικόνα. Αφού φορτώθηκαν τα δεδομένα με επιτυχία, τώρα μπορούμε να διερευνήσουμε τα επιμέρους αντικείμενα του le:

slotNames(le)
[1] "data"        "polygons"    "plotOrder"   "bbox"        "proj4string"
le@data
       code  pop cars villages   type id island
0  83030000 7317  872        7 Πεδινή  0      1
1  83010000 9762  662       15 Πεδινή  1      1
2  83050000 8925  744       17 Πεδινή  2      1
3  83020000 8818  981       12 Πεδινή  3      1
4  83060000 6261  948       12 Πεδινή  4      1
5  83070000 8632  169       17 Πεδινή  5      1
6  83080000 9566  397        5 Ορεινή  6      1
7  83090000 8993  595        5 Πεδινή  7      1
8  83100000 9671  140        6 Αστική  8      1
9  83110000 9099  167       17 Πεδινή  9      1
10 83150000 5022  829        5 Πεδινή 10      1
11 83160000 6236  344       17 Αστική 11      1
12 83170000 8770  517        6 Πεδινή 12      1
13 83060000 6261  948       12 Πεδινή 13      1
le@bbox
        min       max
x  658046.9  726286.4
y 4315084.4 4362331.7
le@proj4string
CRS arguments:
 +proj=tmerc +lat_0=0 +lon_0=24 +k=0.9996 +x_0=500000 +y_0=0 +ellps=GRS80 +units=m +no_defs 
summary(le)
Object of class SpatialPolygonsDataFrame
Coordinates:
        min       max
x  658046.9  726286.4
y 4315084.4 4362331.7
Is projected: TRUE 
proj4string :
[+proj=tmerc +lat_0=0 +lon_0=24 +k=0.9996 +x_0=500000 +y_0=0 +ellps=GRS80 +units=m +no_defs]
Data attributes:
     code                pop            cars          villages         type                 id            island 
 Length:14          Min.   :5022   Min.   :140.0   Min.   : 5.00   Length:14          Min.   : 0.00   Min.   :1  
 Class :character   1st Qu.:6525   1st Qu.:357.2   1st Qu.: 6.00   Class :character   1st Qu.: 3.25   1st Qu.:1  
 Mode  :character   Median :8794   Median :628.5   Median :12.00   Mode  :character   Median : 6.50   Median :1  
                    Mean   :8095   Mean   :593.8   Mean   :10.93                      Mean   : 6.50   Mean   :1  
                    3rd Qu.:9072   3rd Qu.:861.2   3rd Qu.:16.50                      3rd Qu.: 9.75   3rd Qu.:1  
                    Max.   :9762   Max.   :981.0   Max.   :17.00                      Max.   :13.00   Max.   :1  
coordinates(le)
       [,1]    [,2]
0  703311.7 4329229
1  719301.2 4329488
2  713957.2 4321611
3  698637.9 4343954
4  669313.3 4340445
5  707160.0 4335152
6  682411.6 4342046
7  710102.7 4341659
8  701189.6 4353909
9  692661.1 4358641
10 689085.7 4352239
11 703431.2 4321010
12 691494.5 4327555
13 672806.0 4350485

5.2 Διερεύνηση

Μπορούμε να επεξεργαστούμε τα δεδομένα του shapefile και να δημιουργήσουμε νέες στήλες που θα περιλαμβάνουν δεδομένα για κάθε γεωγραφική περιοχή. Για να προσπελάσουμε τα δεδομένα του shapefile εκτελούμε le@data. Προσέξτε οτι για να αποκτήσουμε πρόσβαση σε υπο-αντικείμενο της κλάσης SpatialPolygonsDataFrame χρησιμοποιήσαμε τον τελεστή @ και όχι τον τελεστή $ που χρησιμοποιούμε προηγουμένως για την προσπέλαση υπο-αντικειμένων σε κάποιο data.frame.

le@data 
       code  pop cars villages   type id island
0  83030000 7317  872        7 Πεδινή  0      1
1  83010000 9762  662       15 Πεδινή  1      1
2  83050000 8925  744       17 Πεδινή  2      1
3  83020000 8818  981       12 Πεδινή  3      1
4  83060000 6261  948       12 Πεδινή  4      1
5  83070000 8632  169       17 Πεδινή  5      1
6  83080000 9566  397        5 Ορεινή  6      1
7  83090000 8993  595        5 Πεδινή  7      1
8  83100000 9671  140        6 Αστική  8      1
9  83110000 9099  167       17 Πεδινή  9      1
10 83150000 5022  829        5 Πεδινή 10      1
11 83160000 6236  344       17 Αστική 11      1
12 83170000 8770  517        6 Πεδινή 12      1
13 83060000 6261  948       12 Πεδινή 13      1
le@data$cars
 [1] 872 662 744 981 948 169 397 595 140 167 829 344 517 948
le@data$villages
 [1]  7 15 17 12 12 17  5  5  6 17  5 17  6 12
le@data$type
 [1] "Πεδινή" "Πεδινή" "Πεδινή" "Πεδινή" "Πεδινή" "Πεδινή" "Ορεινή" "Πεδινή" "Αστική" "Πεδινή" "Πεδινή" "Αστική" "Πεδινή" "Πεδινή"
table(le@data$type)

Αστική Ορεινή Πεδινή 
     2      1     11 

Η συνάρτηση spsample παράγει σημεία εντός μιας περιοχής. Έτσι για την δημιουργία σημείων (τυχαία, κανονικοποιημένα, ασύμμετρα και σε εξάγωνη διάταξη) εντός του νησιού, εκτελούμε:

mypoints_ran = spsample(le, n=100, type='random')
mypoints_reg = spsample(le, n=100, type='regular')
mypoints_non = spsample(le, n=100, type='nonaligned')
mypoints_hex = spsample(le, n=100, type='hexagonal')

Ο παρακάτω κώδικας απεικονίζει και 4 είδη σημείων που μόλις παρήχθησαν:

par(mfrow=c(2,2))

plot(le, main="Random")
points(mypoints_ran, col="red", pch=16)

plot(le, main="Stratified")
points(mypoints_reg, col="red", pch=16)

plot(le, main="Nonaligned")
points(mypoints_non, col="red", pch=16)

plot(le, main="Hexagonal")
points(mypoints_hex, col="red", pch=16)

par(mfrow=c(1,1))

Για να δούμε περισσότερες λεπτομέρειες σχετικά με την συνάρτηση spsample, εκτελούμε τον παρακάτω κώδικα:

?spsample

Δημιουργία μιας νέας στήλης με νέων τιμές. Για να δούμε ποιο είναι η σχέση πληθυσμού με αυτοκίνητα, διαιρούμε το πληθυσμό της κάθε περιοχής με το πλήθος των αυτοκινήτων. Το νούμερο που θα προκύψει, δείχνει το αριθμό αυτοκινήτων ανά κάτοικο για κάθε περιοχή:

le@data$ratio_cars =  le@data$cars / le@data$pop 
le@data
       code  pop cars villages   type id island ratio_cars
0  83030000 7317  872        7 Πεδινή  0      1 0.11917453
1  83010000 9762  662       15 Πεδινή  1      1 0.06781397
2  83050000 8925  744       17 Πεδινή  2      1 0.08336134
3  83020000 8818  981       12 Πεδινή  3      1 0.11124972
4  83060000 6261  948       12 Πεδινή  4      1 0.15141351
5  83070000 8632  169       17 Πεδινή  5      1 0.01957831
6  83080000 9566  397        5 Ορεινή  6      1 0.04150115
7  83090000 8993  595        5 Πεδινή  7      1 0.06616257
8  83100000 9671  140        6 Αστική  8      1 0.01447627
9  83110000 9099  167       17 Πεδινή  9      1 0.01835367
10 83150000 5022  829        5 Πεδινή 10      1 0.16507368
11 83160000 6236  344       17 Αστική 11      1 0.05516357
12 83170000 8770  517        6 Πεδινή 12      1 0.05895097
13 83060000 6261  948       12 Πεδινή 13      1 0.15141351

Επίσης για να δημιουργήσουμε άλλον ένα δείκτη που να φανερώνει την σχέση πληθυσμού ανά ποσότητα χωριών για κάθε περιοχή, εκτελούμε τον ακόλουθο κώδικα ο οποίος αναθέτει τα αποτελέσματα του δείκτη σε μια νέα στήλη με το όνομα ratio_villages:

le@data$ratio_villages =   le@data$villages / le@data$pop 
le@data
       code  pop cars villages   type id island ratio_cars ratio_villages
0  83030000 7317  872        7 Πεδινή  0      1 0.11917453   0.0009566762
1  83010000 9762  662       15 Πεδινή  1      1 0.06781397   0.0015365704
2  83050000 8925  744       17 Πεδινή  2      1 0.08336134   0.0019047619
3  83020000 8818  981       12 Πεδινή  3      1 0.11124972   0.0013608528
4  83060000 6261  948       12 Πεδινή  4      1 0.15141351   0.0019166267
5  83070000 8632  169       17 Πεδινή  5      1 0.01957831   0.0019694161
6  83080000 9566  397        5 Ορεινή  6      1 0.04150115   0.0005226845
7  83090000 8993  595        5 Πεδινή  7      1 0.06616257   0.0005559880
8  83100000 9671  140        6 Αστική  8      1 0.01447627   0.0006204115
9  83110000 9099  167       17 Πεδινή  9      1 0.01835367   0.0018683372
10 83150000 5022  829        5 Πεδινή 10      1 0.16507368   0.0009956193
11 83160000 6236  344       17 Αστική 11      1 0.05516357   0.0027261065
12 83170000 8770  517        6 Πεδινή 12      1 0.05895097   0.0006841505
13 83060000 6261  948       12 Πεδινή 13      1 0.15141351   0.0019166267

5.3 Βιβλιοθήκες

Η γλώσσα προγραμματισμού R επεκτείνετε με την χρήση επιπλέον βιβλιοθηκών οι οποίες προσθέτουν επιπλέον δυνατότητες και συναρτήσεις. Οι βιβλιοθήκες περιλαμβάνουν εξειδικευμένες δυνατότητες σχετικές με διάφορες επιστήμες. Έτσι για παράδειγμα για την χρήση γεωγραφικών δεδομένων μπορούμε να εγκαταστήσουμε και στην συνέχεια να καλέσουμε την βιβλιοθήκη maptools η οποία προσφέρει στην R την δυνατότητα ανάκτησης, διαχείρισης και αποθήκευσης δεδομένων γεωγραφικού τύπου όπως πχ shapefiles. Το ακόλουθο παράδειγμα αναδεικνύει την εγκατάσταση, κλήση και χρήση της βιβλιοθήκης rgdal για την ανάκτηση/αποθήκευση ενός αρχείου τύπου shapefile.

# install.packages("maptools", dep=T) 
# install.packages("rgdal", dep=T)
# library(maptools)
# library(rgdal)
# 
# mydata = rgdal::readOGR("myfile.shp")
# rgdal::writeOGR(mydata,"anewname", "anewname.shp", driver="ESRI Shapefile")

5.4 Οπτικοποίηση

library(rgdal)
library(RColorBrewer)
library(MASS)
library(GISTools)
library(classInt)
library(maptools)
library(maps)

Απλή απεικόνιση των πολυγώνων

plot(le)

Απεικόνιση των πολυγώνων με πορτοκαλί χρώμα και γαλάζιο χρώμα στο παρασκήνιο:

plot(le, col="orange", bg="cyan")

Κατασκευή απλού χάρτη του νησιού με βάση 4 πληθυσμιακές κατηγορίες:

library(RColorBrewer)
library(classInt)
library(maptools)
library(rgdal)
nclasses = 4
mycolors = brewer.pal(nclasses, "YlOrRd")
brks = classIntervals(le@data$pop, n=nclasses, style="quantile")
brks = brks$brks
plot(le, col=mycolors[findInterval(le@data$pop, brks,all.inside=T)], axes=F)
title( "Λέσβος" )
legend("bottomleft", legend=rev(leglabs(round(brks))),  title= "Υπόμνημα", fill=rev(mycolors))

5.5 Join

Τα αρχικά δεδομένα από το Shapefile μας είναι τα ακόλουθα:

le@data
       code  pop cars villages   type id island ratio_cars ratio_villages
0  83030000 7317  872        7 Πεδινή  0      1 0.11917453   0.0009566762
1  83010000 9762  662       15 Πεδινή  1      1 0.06781397   0.0015365704
2  83050000 8925  744       17 Πεδινή  2      1 0.08336134   0.0019047619
3  83020000 8818  981       12 Πεδινή  3      1 0.11124972   0.0013608528
4  83060000 6261  948       12 Πεδινή  4      1 0.15141351   0.0019166267
5  83070000 8632  169       17 Πεδινή  5      1 0.01957831   0.0019694161
6  83080000 9566  397        5 Ορεινή  6      1 0.04150115   0.0005226845
7  83090000 8993  595        5 Πεδινή  7      1 0.06616257   0.0005559880
8  83100000 9671  140        6 Αστική  8      1 0.01447627   0.0006204115
9  83110000 9099  167       17 Πεδινή  9      1 0.01835367   0.0018683372
10 83150000 5022  829        5 Πεδινή 10      1 0.16507368   0.0009956193
11 83160000 6236  344       17 Αστική 11      1 0.05516357   0.0027261065
12 83170000 8770  517        6 Πεδινή 12      1 0.05895097   0.0006841505
13 83060000 6261  948       12 Πεδινή 13      1 0.15141351   0.0019166267

Σε αυτά τα δεδομένα, θα προσπαθήσουμε να επισυνάπτουμε άλλη μια επιπλέον στήλη, η οποία προσδιορίζει το όνομα της κάθε γεωγραφικής περιοχής. Τα ονόματα βρίσκονται σε ένα αρχείο .csv το οποίο εισάγουμε στην R και στην συνέχεια επικολλούμε με τα δεδομένα του Shapefile χρησιμοποιώντας την κοινή στήλη id.

onomata = read.csv("Data/onomata.csv")
onomata
   id      onoma
1   0 Περιοχή ΑΑ
2   1 Περιοχή ΒΒ
3   2 Περιοχή ΓΓ
4   3 Περιοχή ΔΔ
5   4 Περιοχή ΕΕ
6   5 Περιοχή ΖΖ
7   6 Περιοχή ΗΗ
8   7 Περιοχή ΘΘ
9   8 Περιοχή ΙΙ
10  9 Περιοχή ΚΚ
11 10 Περιοχή ΛΛ
12 11 Περιοχή ΜΜ
13 12 Περιοχή NΝ
14 13 Περιοχή ΞΞ
if (!("onoma" %in% names(le@data))) {
  temp = merge(le@data, onomata, by="id", sort=FALSE)
  le@data = temp
}
le@data
   id     code  pop cars villages   type island ratio_cars ratio_villages      onoma
1   0 83030000 7317  872        7 Πεδινή      1 0.11917453   0.0009566762 Περιοχή ΑΑ
2   1 83010000 9762  662       15 Πεδινή      1 0.06781397   0.0015365704 Περιοχή ΒΒ
3   2 83050000 8925  744       17 Πεδινή      1 0.08336134   0.0019047619 Περιοχή ΓΓ
4   3 83020000 8818  981       12 Πεδινή      1 0.11124972   0.0013608528 Περιοχή ΔΔ
5   4 83060000 6261  948       12 Πεδινή      1 0.15141351   0.0019166267 Περιοχή ΕΕ
6   5 83070000 8632  169       17 Πεδινή      1 0.01957831   0.0019694161 Περιοχή ΖΖ
7   6 83080000 9566  397        5 Ορεινή      1 0.04150115   0.0005226845 Περιοχή ΗΗ
8   7 83090000 8993  595        5 Πεδινή      1 0.06616257   0.0005559880 Περιοχή ΘΘ
9   8 83100000 9671  140        6 Αστική      1 0.01447627   0.0006204115 Περιοχή ΙΙ
10  9 83110000 9099  167       17 Πεδινή      1 0.01835367   0.0018683372 Περιοχή ΚΚ
11 10 83150000 5022  829        5 Πεδινή      1 0.16507368   0.0009956193 Περιοχή ΛΛ
12 11 83160000 6236  344       17 Αστική      1 0.05516357   0.0027261065 Περιοχή ΜΜ
13 12 83170000 8770  517        6 Πεδινή      1 0.05895097   0.0006841505 Περιοχή NΝ
14 13 83060000 6261  948       12 Πεδινή      1 0.15141351   0.0019166267 Περιοχή ΞΞ
le@data$onoma = as.character(le@data$onoma)
rgdal::writeOGR(le,"Lesvos_Joined","Lesvos_Joined.shp", driver="ESRI Shapefile", overwrite=T)
plot(le, col = mycolors[findInterval(le@data$pop, brks, all.inside = TRUE)], axes = F)
cen = coordinates(le)
text(cen, le@data$onoma, cex=0.8)

Τα κεντροειδή μπορούν να χρησιμοποιηθούν και ξεχωριστά από το shapefile ακόμα και να εξαχθούν σε ένα αυτόνομο shapefile που θα περιλαμβάνει σημεία.

plot(le)
points(cen, cex=2, col="red")

cen2 = SpatialPoints(cen)
cen3 = SpatialPointsDataFrame(cen2, data=data.frame(cen2))
rgdal::writeOGR(cen3,"centroids","centroids.shp", driver="ESRI Shapefile", overwrite=T)

Quadrat Count Analysis 2 διαφορετικών χωρικών δειγμάτων. Ενός τυχαίου και ενός κανονικοποιημένου σε εξαγωνική διάταξη.

library(spatstat)
perioxi = le[le@data$onoma=="Περιοχή ΕΕ",]

Παραγωγή 70 σημείων εντός της ευρύτερης περιοχής

n=70
mysample1 = as( spsample(perioxi, n=n, type='hexagonal'), "ppp")
mysample2 = as( spsample(perioxi, n=n, type='random'), "ppp")
plot(le)
plot(perioxi, add=T, col="red")

Κανονικοποιημένη εξαγωνική διάταξη

qc1 = quadratcount(mysample1, nx=10)
plot(perioxi)
#image( intensity(qc1, image=T), col = heat.colors(10,alpha = 0.5),  add = T)
points(mysample1, cex=0.5, col="darkgrey")
plot(qc1, add=T, col="brown", cex=1, lty=3)

Τυχαία διάταξη

qc2 = quadratcount(mysample2, nx=10)
plot(perioxi)
#image( intensity(qc2, image=T), col = heat.colors(10,alpha = 0.5),  add = T)
points(mysample2, cex=0.5, col="darkgrey")
plot(qc2, add=T, col="brown", cex=1, lty=3)

5.6 Βιβλιοθήκη spatstat

plot(perioxi)
points(mysample2, pch=20)

summary(mysample2)
Planar point pattern:  70 points
Average intensity 1.822305e-07 points per square unit

Coordinates are given to 1 decimal place
i.e. rounded to the nearest multiple of 0.1 units

Window: rectangle = [659985.2, 679288.5] x [4329690, 4349590] units
                    (19300 x 19900 units)
Window area = 384129000 square units

Υπολογισμός της απόστασης του πλησιέστερου γείτονα για όλα τα σημεία

nearest = nndist(mysample2)
summary(nearest)
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
  111.0   599.5   983.4  1146.9  1575.7  3862.7 
sd(nearest)
[1] 786.3685
hist(nearest, col="green")

Υπολογισμός του πλησιέστερου γείτονα για όλα τα σημεία.

m = nnwhich(mysample2)
m2 = nnwhich(mysample2, k=2)

Οπτικοποίηση του πλησιέστερου γείτονα για κάθε σημείο.

b = mysample2[m]
plot(mysample2)
arrows(mysample2$x, mysample2$y, b$x, b$y, angle=15, length=0.15, col="red")

Διάγραμμα πυκνότητας

plot(density(mysample2, 10))

plot(density(mysample2, 100))

plot(density(mysample2, 1000))
points(mysample2, pch=20)

Διάγραμμα ισό-πυκνων καμπυλών

contour(density(mysample2,10), axes=FALSE)

contour(density(mysample2,100), axes=FALSE)

contour(density(mysample2,1000), axes=FALSE)
points(mysample2, pch=20)