Σημείωση δεδομένων. Το αρχείο climate_change.csv που δόθηκε είχε αλλοιωμένη αριθμητική μορφή (π.χ. Temp = 109 αντί 0.109, TSI = 13.661.024 αντί 1366.1024). Όλη η ανάλυση γίνεται στο διορθωμένο αρχείο climate_change_clean.csv που συνοδεύει την παράδοση (μην το αντικαταστήσεις με το αλλοιωμένο climate_change.csv).

1 Φόρτωση & εξερεύνηση (1.1)

climate <- read.csv("climate_change_clean.csv")

# --- Έλεγχος ασφαλείας: όλες οι στήλες πρέπει να είναι αριθμητικές ---
if (!all(sapply(climate, is.numeric))) {
  stop("Το αρχείο διαβάστηκε με μη-αριθμητικές στήλες. Βεβαιώσου ότι χρησιμοποιείς ",
       "το climate_change_clean.csv (όχι το αλλοιωμένο climate_change.csv).")
}
names(climate)
##  [1] "Year"     "Month"    "MEI"      "CO2"      "CH4"      "N2O"     
##  [7] "CFC.11"   "CFC.12"   "TSI"      "Aerosols" "Temp"
str(climate)
## 'data.frame':    308 obs. of  11 variables:
##  $ Year    : int  1983 1983 1983 1983 1983 1983 1983 1983 1984 1984 ...
##  $ Month   : int  5 6 7 8 9 10 11 12 1 2 ...
##  $ MEI     : num  2.556 2.167 1.741 1.13 0.428 ...
##  $ CO2     : num  346 346 344 342 340 ...
##  $ CH4     : num  1639 1634 1633 1631 1648 ...
##  $ N2O     : num  304 304 304 304 304 ...
##  $ CFC.11  : num  191 192 193 194 194 ...
##  $ CFC.12  : num  350 352 354 356 357 ...
##  $ TSI     : num  1366 1366 1366 1366 1366 ...
##  $ Aerosols: num  0.0863 0.0794 0.0731 0.0673 0.0619 0.0569 0.0524 0.0486 0.0451 0.0416 ...
##  $ Temp    : num  0.109 0.118 0.137 0.176 0.149 0.093 0.232 0.078 0.089 0.013 ...

Το dataset έχει 308 παρατηρήσεις και 11 μεταβλητές. Βρίσκουμε τις 5 ισχυρότερες συσχετίσεις της Temp με τις υπόλοιπες μεταβλητές (κατά απόλυτη τιμή):

cors <- cor(climate)["Temp", ]
cors <- cors[names(cors) != "Temp"]
sort(abs(cors), decreasing = TRUE)[1:5]
##      Year       CO2       N2O       CH4    CFC.12 
## 0.7557311 0.7485046 0.7432418 0.6996966 0.6889441

➜ Απάντηση. Οι 5 ισχυρότερες συσχετίσεις είναι: Year (0.756), CO2 (0.749), N2O (0.743), CH4 (0.700), CFC.12 (0.689).

Χωρίζουμε σε training set (έως και το 2006) και testing set (μετά το 2006):

train <- subset(climate, Year <= 2006)
test  <- subset(climate, Year >  2006)
c(train = nrow(train), test = nrow(test))
## train  test 
##   284    24

➜ Απάντηση. Training set: 284 παρατηρήσεις · Testing set: 24 παρατηρήσεις.

2 Μοντέλο Temp ~ CO2 (1.2)

m1 <- lm(Temp ~ CO2, data = train)
summary(m1)
## 
## Call:
## lm(formula = Temp ~ CO2, data = train)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -0.31912 -0.07819 -0.00129  0.05805  0.43420 
## 
## Coefficients:
##               Estimate Std. Error t value Pr(>|t|)    
## (Intercept) -4.2646515  0.2096815  -20.34   <2e-16 ***
## CO2          0.0124855  0.0005799   21.53   <2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 0.1116 on 282 degrees of freedom
## Multiple R-squared:  0.6218, Adjusted R-squared:  0.6204 
## F-statistic: 463.6 on 1 and 282 DF,  p-value: < 2.2e-16

Τα σφάλματα (residuals) και ο υπολογισμός του SSE:

SSE1 <- sum(m1$residuals^2)
SSE1                      # SSE
## [1] 3.511885
summary(m1)$r.squared     # R-squared
## [1] 0.6217783

➜ Απάντηση. SSE = 3.512 · R² = 0.622. Ο συντελεστής του CO2 (0.0125) είναι θετικός και εξαιρετικά σημαντικός (p < 2e-16).

3 Μοντέλο με όλες τις μεταβλητές (1.3)

m2 <- lm(Temp ~ MEI + CO2 + CH4 + N2O + CFC.11 + CFC.12 + TSI + Aerosols,
         data = train)
summary(m2)
## 
## Call:
## lm(formula = Temp ~ MEI + CO2 + CH4 + N2O + CFC.11 + CFC.12 + 
##     TSI + Aerosols, data = train)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -0.25888 -0.05913 -0.00082  0.05649  0.32433 
## 
## Coefficients:
##               Estimate Std. Error t value Pr(>|t|)    
## (Intercept) -1.246e+02  1.989e+01  -6.265 1.43e-09 ***
## MEI          6.421e-02  6.470e-03   9.923  < 2e-16 ***
## CO2          6.457e-03  2.285e-03   2.826  0.00505 ** 
## CH4          1.240e-04  5.158e-04   0.240  0.81015    
## N2O         -1.653e-02  8.565e-03  -1.930  0.05467 .  
## CFC.11      -6.631e-03  1.626e-03  -4.078 5.96e-05 ***
## CFC.12       3.808e-03  1.014e-03   3.757  0.00021 ***
## TSI          9.314e-02  1.475e-02   6.313 1.10e-09 ***
## Aerosols    -1.538e+00  2.133e-01  -7.210 5.41e-12 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 0.09171 on 275 degrees of freedom
## Multiple R-squared:  0.7509, Adjusted R-squared:  0.7436 
## F-statistic: 103.6 on 8 and 275 DF,  p-value: < 2.2e-16
SSE2 <- sum(m2$residuals^2)
c(SSE = SSE2, R2 = summary(m2)$r.squared)
##       SSE        R2 
## 2.3130196 0.7508933

➜ Απάντηση. SSE = 2.313 · R² = 0.751.

Τι παρατηρούμε — δικαιολόγηση. Το R² αυξήθηκε αισθητά (0.62 → 0.75), γιατί προστέθηκαν περισσότερες επεξηγηματικές μεταβλητές. Όμως οι συντελεστές των N2O και CFC.11 βγαίνουν αρνητικοί, ενώ πρόκειται για αέρια του θερμοκηπίου (θα περιμέναμε θετική επίδραση στη θερμοκρασία). Αυτό οφείλεται σε πολυσυγγραμμικότητα (multicollinearity): οι ανεξάρτητες μεταβλητές είναι ισχυρά συσχετισμένες μεταξύ τους, οπότε οι εκτιμήσεις των συντελεστών γίνονται ασταθείς και δύσκολα ερμηνεύσιμες.

sort(abs(cor(train)["N2O", ]), decreasing = TRUE)
##        N2O       Year        CO2        CH4     CFC.12       Temp     CFC.11 
## 1.00000000 0.99384523 0.97671982 0.89983864 0.86793078 0.77863893 0.52247732 
##   Aerosols        TSI        MEI      Month 
## 0.33705457 0.19975668 0.05081978 0.01363153

Οι μεταβλητές με υψηλή συσχέτιση με το N2O (|r| > 0.7) είναι CO2 (0.977), CH4 (0.900) και CFC.12 (0.868). Τις αφαιρούμε και φτιάχνουμε νέο μοντέλο:

m3 <- lm(Temp ~ MEI + N2O + CFC.11 + TSI + Aerosols, data = train)
summary(m3)
## 
## Call:
## lm(formula = Temp ~ MEI + N2O + CFC.11 + TSI + Aerosols, data = train)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -0.28659 -0.05808 -0.00547  0.05688  0.34529 
## 
## Coefficients:
##               Estimate Std. Error t value Pr(>|t|)    
## (Intercept) -1.200e+02  2.069e+01  -5.804 1.77e-08 ***
## MEI          6.479e-02  6.689e-03   9.686  < 2e-16 ***
## N2O          2.599e-02  1.515e-03  17.153  < 2e-16 ***
## CFC.11      -2.915e-04  3.289e-04  -0.886    0.376    
## TSI          8.219e-02  1.519e-02   5.411 1.35e-07 ***
## Aerosols    -1.683e+00  2.191e-01  -7.681 2.70e-13 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 0.09551 on 278 degrees of freedom
## Multiple R-squared:  0.7269, Adjusted R-squared:  0.722 
## F-statistic:   148 on 5 and 278 DF,  p-value: < 2.2e-16
SSE3 <- sum(m3$residuals^2)
c(SSE = SSE3, R2 = summary(m3)$r.squared)
##       SSE        R2 
## 2.5357702 0.7269036

➜ Απάντηση. SSE = 2.536 · R² = 0.727. Με 3 λιγότερες μεταβλητές το R² μειώθηκε ελάχιστα (0.751 → 0.727) και πλέον ο συντελεστής του N2O είναι θετικός και σημαντικός — φυσικά ορθό αποτέλεσμα.

4 Προβλέψεις στο testing set (1.4)

pred <- predict(m3, newdata = test)
SSE <- sum((test$Temp - pred)^2)
SST <- sum((test$Temp - mean(train$Temp))^2)
R2  <- 1 - SSE/SST
c(SSE = SSE, SST = SST, R2 = R2)
##       SSE       SST        R2 
## 0.3151458 0.5860189 0.4622258

➜ Απάντηση. Στο testing set: SSE = 0.315 · SST = 0.586 · R² = 0.462.

Γράφημα Temp (άξονας x) με CO2 (άξονας y) στο αρχικό σετ:

plot(climate$Temp, climate$CO2, xlab = "Temp", ylab = "CO2",
     main = "CO2 vs Temp", pch = 19, col = "steelblue")
abline(lm(CO2 ~ Temp, data = climate), col = "red", lwd = 2)

cor(climate$Temp, climate$CO2)
## [1] 0.7485046

➜ Απάντηση. Ναι, υπάρχει σαφής θετική γραμμική συσχέτιση (r = 0.749): καθώς αυξάνεται η θερμοκρασία, αυξάνεται και η συγκέντρωση CO2.