library(tidyverse)
library(readxl)Analiza korelacji
Statystyczne i graficzne podstawy geowizualizacji
1 Demonstracja dla współczynnika korelacji liniowej
install.packages("TeachingDemos")
library("TeachingDemos")
put.points.demo(x = NULL, y = NULL, lsline = TRUE)
#Używając opcji Add Point dodaj punkty w oknie wykresu
#Zwróć uwagę jak zmienia się wartość współczynnika korelacji (r). Zgadnij wartość współczynnika korelacji - https://gallery.shinyapps.io/correlation_game/
2 Testy korelacji
test korelacji liniowej Pearsona
- stosowany gdy zmienne mają zależnośc liniową
- zmienne mają rozkład normalny
test korelacji rang Spearman
- stosowany gdy naruszone jest założenie o normalności rozkładu (np. gdy istnieją wartości odstające)
3 Korelacja liniowa
set.seed(25)
x = rnorm(1000)
y = x + rnorm(1000)
df = data.frame(x, y)Funkcja plot() pozwala na wykonanie prostego wykresu rozrzutu.
plot(y~x, df)
3.1 Zbadanie normalności rozkładu
Funkcja hist() pozwala na wykonie histogramów.
hist(df$x)
hist(df$y)
Funkcja shapiro.test() służy do wykonania testu Shapiro-Wilka sprawdzającego czy dane mają rozkład normalny. Wartość p-value > 0.05 wskazuje, że dane pochodzą z rozkładu normalnego.
shapiro.test(x)
Shapiro-Wilk normality test
data: x
W = 0.99811, p-value = 0.3298
shapiro.test(y)
Shapiro-Wilk normality test
data: y
W = 0.99854, p-value = 0.5832
Zmienna x oraz y mają rozkład normalny.
3.2 Współczynnik korelacji
Współczynnik korelacji obliczany jest z wykorzystaniem funkcji cor(). Argument method pozwala na określenie czy ma być obliczony współczynnik korelacji Pearsona (method = “pearson”), czy też współczynnik korelacji rang Spearmana (method = “Spearman”). Argument use = “complete.obs oznacza, że do obliczenia korelacji zostaną wybrane tylko te obserwacje, dla których jest podana wartość x oraz y.
cor(df$x, df$y,
use = "complete.obs",
method = "pearson")[1] 0.679556
cor(df$x, df$y,
use = "complete.obs",
method = "spearman")[1] 0.6636062
Która metoda korelacji powinna zostać użyta - korelacja liniowa Pearsona, czy korelacja rang Spearmana? Dlaczego?
3.3 Testy korelacji
Funkcja cor.test() wykonuje test korelacji. W wyniku testu:
- p-value określa poziom istotności, jeśli p-value < 0.05 współczynnik korelacji jest istotny statystycznie
- conf.int to 95% przedział ufności, w którym mieści się prawdziwa wartość współczynnika korelacji
- sample estimates is to wartość współczynnika korelacji
cor.test(df$x, df$y,
use = "complete.obs",
method = "pearson")
Pearson's product-moment correlation
data: df$x and df$y
t = 29.263, df = 998, p-value < 2.2e-16
alternative hypothesis: true correlation is not equal to 0
95 percent confidence interval:
0.6447237 0.7115721
sample estimates:
cor
0.679556
Wynik testu korelacji wskazuje na istnieie istotnej korelacji między zmienną x oraz y.
4 Przykład. Analiza danych meteorologicznych.
Plik dane/meteo2020.xlsx zawiera miesięczne wartości dla 59 stacji synoptycznych dla 2020 roku:
- id - id stacji
- station - nazwa stacji
- X, Y - współrzędne X, Y określające lokalizację stacji
- wojewodztwo - nazwa województwa, w którym się stacja znajduje.
- woj_id - TERYT województwa
- mm - miesiąc
- tmax_abs - miesięczna wartość temperatury maksymalnej [C]
- tmax_mean - średnia miesięczna wartość temperatury maksymalnej [C]
- tmin_abs - miesięczna wartość temperatury minimalnej [C]
- tmin_mean - średnia miesięczna wartość temperatury minimalnej [C]
- t2m_mean_mon - średnia temperatura miesieczna [C]
- t5cm_min - minimalna temperatura przy gruncie [C]
- rr_monthly - miesieczna suma opadow [mm]
- rr_max_daily - maksymalna dobowa suma opadow [mm]
- rain_days - liczba dni z opadem deszczu
- snow_days - liczba dni z opadem śniegu
library(readxl)
meteo = read_excel("dane/meteo2020.xlsx")4.1 Analiza korelacji między zmiennymi tmin_mean a tmax_mean
- Wykres rozrzutu
plot(meteo$tmin_mean, meteo$tmax_mean)
- Czy zmienne mają rozkład normalny?
shapiro.test(meteo$tmax_mean)
Shapiro-Wilk normality test
data: meteo$tmax_mean
W = 0.94879, p-value = 6.023e-15
shapiro.test(meteo$tmin_mean)
Shapiro-Wilk normality test
data: meteo$tmin_mean
W = 0.93303, p-value < 2.2e-16
- wspolczynnik korelacji
cor(meteo$tmax_mean, meteo$tmin_mean,
use = "complete.obs",
method = "spearman")[1] 0.8890966
- test korelacji
cor.test(meteo$tmax_mean, meteo$tmin_mean,
use = "complete.obs",
method = "spearman")Warning in cor.test.default(meteo$tmax_mean, meteo$tmin_mean, use =
"complete.obs", : Cannot compute exact p-value with ties
Spearman's rank correlation rho
data: meteo$tmax_mean and meteo$tmin_mean
S = 6559830, p-value < 2.2e-16
alternative hypothesis: true rho is not equal to 0
sample estimates:
rho
0.8890966
5 Analiza korelacji dla wielu zmiennych
sel = meteo %>%
select(tmax_mean,tmin_mean, t5cm_min, t2m_mean_mon)- Macierz wykresów rozrzutu
pairs(~., data=sel, main="Macierz wykresów rozrzutu")
Macierz wykresów rozrzutu można także wykonać wykorzystując funkcję chart.Correlation() z pakietu PerformanceAnalytics
library("PerformanceAnalytics")
chart.Correlation(sel, histogram=TRUE, pch=19, method = "spearman" )Warning in cor.test.default(as.numeric(x), as.numeric(y), method = method):
Cannot compute exact p-value with ties
Warning in cor.test.default(as.numeric(x), as.numeric(y), method = method):
Cannot compute exact p-value with ties
Warning in cor.test.default(as.numeric(x), as.numeric(y), method = method):
Cannot compute exact p-value with ties
Warning in cor.test.default(as.numeric(x), as.numeric(y), method = method):
Cannot compute exact p-value with ties
Warning in cor.test.default(as.numeric(x), as.numeric(y), method = method):
Cannot compute exact p-value with ties
Warning in cor.test.default(as.numeric(x), as.numeric(y), method = method):
Cannot compute exact p-value with ties

- Obliczenie macierzy współczynników korelacji dla wielu zmiennych.
cor(sel, use = "complete.obs", method = "spearman") tmax_mean tmin_mean t5cm_min t2m_mean_mon
tmax_mean 1.0000000 0.8890966 0.7267208 0.9559309
tmin_mean 0.8890966 1.0000000 0.8723577 0.9395978
t5cm_min 0.7267208 0.8723577 1.0000000 0.8056521
t2m_mean_mon 0.9559309 0.9395978 0.8056521 1.0000000
Macierz korelacji wraz z informacją o poziomie istotności można uzyskać wykorzystując funckę rcorr() z pakietu Hmisc. Pierwsza macierz zawiera współczynnik korelacji, druga liczbę obiektów a trzecia wartość poziomu istotności p. Wartość jest istotna statystycznie jeśli p jest mniejsze od założonego poziomu isotntości (np. 0.05). Wartość 0 oznacza, że p < 0.0001.
library(Hmisc)
kor <- rcorr(as.matrix(sel), type = "spearman")
print( kor, digits=3) tmax_mean tmin_mean t5cm_min t2m_mean_mon
tmax_mean 1.00 0.89 0.73 0.96
tmin_mean 0.89 1.00 0.87 0.94
t5cm_min 0.73 0.87 1.00 0.81
t2m_mean_mon 0.96 0.94 0.81 1.00
n= 708
P
tmax_mean tmin_mean t5cm_min t2m_mean_mon
tmax_mean 0 0 0
tmin_mean 0 0 0
t5cm_min 0 0 0
t2m_mean_mon 0 0 0
6 Wizualizacja korelacji między zmiennymi z wykorzystaniem pakietu corrplot
Funkcja corrplot() z pakietu corrplot pozwala na wizualizację macierzy korelacji. Podstawowym parametrem jest macierz korelacji, którą można obliczyć wykorzystując funkcję cor() lub rcorr() z pakietu Hmisc.
library("corrplot")corrplot 0.95 loaded
korelacja = cor(sel)
corrplot(korelacja)
library("corrplot")
library(Hmisc)
kor <- rcorr(as.matrix(sel), type = "spearman")
corrplot(kor$r)
library("corrplot")
library(Hmisc)
kor <- rcorr(as.matrix(sel), type = "spearman")
corrplot(kor$r, method = "number")
corrplot(kor$r, method = 'color', order = 'alphabet')
corrplot(kor$r, method = 'color', order = 'hclust')
corrplot(kor$r, type = "upper", order = "hclust",
tl.col = "black", tl.srt = 45)
corrplot.mixed(kor$r, order="hclust", tl.col="black")
corrplot.mixed(kor$r, lower = 'shade', upper = 'pie', order = 'hclust')
library(RColorBrewer)
corrplot(kor$r, type="upper", order="hclust", col=brewer.pal(n=8, name="RdYlBu"), tl.col="black")
7 Wizualizacja macierzy wykresów rozrzutu
- Funckja
scatterplotMatrix()z pakietucar
library(car)
scatterplotMatrix(~tmax_mean+tmin_mean+t2m_mean_mon+t5cm_min, data=sel)
- Funkcja
chart.Correlation()z pakietuPerformanceAnalytics
library(PerformanceAnalytics)
chart.Correlation(sel, histogram=TRUE, pch=19, method = "spearman")Warning in cor.test.default(as.numeric(x), as.numeric(y), method = method):
Cannot compute exact p-value with ties
Warning in cor.test.default(as.numeric(x), as.numeric(y), method = method):
Cannot compute exact p-value with ties
Warning in cor.test.default(as.numeric(x), as.numeric(y), method = method):
Cannot compute exact p-value with ties
Warning in cor.test.default(as.numeric(x), as.numeric(y), method = method):
Cannot compute exact p-value with ties
Warning in cor.test.default(as.numeric(x), as.numeric(y), method = method):
Cannot compute exact p-value with ties
Warning in cor.test.default(as.numeric(x), as.numeric(y), method = method):
Cannot compute exact p-value with ties

- Funkcja
pairs.panels()z pakietupsych
library(psych)
pairs.panels(sel, scale=TRUE, method="spearman")