Accenniamo, solo, a come si può ottenere un coeff. di correlazione
nel caso di approssimazioni con funz. polinomiali di 2º e 3º grado.
Algortimi per il loro calcolo sono incorporati (e facilmente utilizzabili) anche nella libreria
accessibile con
Iniziamo con le approssimazioni di 2º grado.
x <- c(0,1,2,3,4,5); y <- c(2.1,7.7,13.6,27.2,40.9,61.1) n <- length(x); n; length(y) # 6 6 Ho controllato se ho introdotto lo stesso numero di x ed y plot(x,y) abline(v=axTicks(1), h=axTicks(2), col="blue",lty=3) a <- sum(x); b <- sum(x^2); c <- sum(x^3); d <- sum(x^4) e <- sum(y); f <- sum(x*y); g <- sum(x*x*y) ma <- matrix(data = c(n,a,b,a,b,c,b,c,d), nrow = 3, ncol = 3) noti <- matrix(data = c(e,f,g), nrow = 3, ncol = 1) S <- solve(ma,noti); S # [,1] # [1,] 2.478571 # [2,] 2.359286 # [3,] 1.860714 # i dati sono approssimati da x -> 2.48+2.36*x+1.86*x^2 F <- function(x) S[1]+S[2]*x+S[3]*x^2 curve(F,add=TRUE,col="blue") # Ecco come determinare il coeff. di correlazione: Sr <- sum((y-F(x))^2) # somma dei quadrati dei degli scarti di y da F(x) Sm <- sum((y-mean(y))^2) # somma dei quadrati degli scarti di y da M(y) CoeffCorr <- sqrt((Sm-Sr)/Sm); CoeffCorr # 0.9992544 Un valore molto vicino ad 1! # # Vediamo che cosa accade con altri dati: x <- c(0,1,2,3,4,5); y <- c(2,19,38,15,48,43) n <- length(x); n; length(y) # 6 6 plot(x,y,col="red") abline(v=axTicks(1), h=axTicks(2), col="blue",lty=3) a <- sum(x); b <- sum(x^2); c <- sum(x^3); d <- sum(x^4) e <- sum(y); f <- sum(x*y); g <- sum(x*x*y) ma <- matrix(data = c(n,a,b,a,b,c,b,c,d), nrow = 3, ncol = 3) noti <- matrix(data = c(e,f,g), nrow = 3, ncol = 1) S <- solve(ma,noti); S # [,1] # [1,] 5.0714286 # [2,] 12.5071429 # [3,] -0.9642857 F <- function(x) S[1]+S[2]*x+S[3]*x^2 curve(F,add=TRUE,col="blue") Sr <- sum((y-F(x))^2) # somma dei quadrati dei degli scarti di y da F(x) Sm <- sum((y-mean(y))^2) # somma dei quadrati degli scarti di y da M(y) CoeffCorr <- sqrt((Sm-Sr)/Sm); CoeffCorr # 0.8048214Si ottiene anche in questo caso un coefficiente di correlazione abbastanza alto. Non basta il coefficiente ottenuto per stabilire se l'approssimazione è buona. Occorrerebbe tener conto della numerosità dei dati e valutare opportunamente la precisione con cui si è ottenuto il coefficiente, in modo simile a quanto si è fatto (vedi) per la correlazione lineare; non possiamo, qui, approfondire questi argomenti. Poi, eventualmente, sarebbe opportuna qualche considerazione "non statistica" per assicurarci che la funzione approssimante è polinomiale di secondo grado.
x <- c(0,1,2,3,4,5); y <- c(2.1,7.7,13.6,27.2,40.9,61.1) n <- length(x); n; length(y) plot(x,y) abline(v=axTicks(1), h=axTicks(2), col="blue",lty=3) # Regressione polinomiale di 2º grado: a <- sum(x); b <- sum(x^2); c <- sum(x^3); d <- sum(x^4) e <- sum(y); f <- sum(x*y); g <- sum(x*x*y) ma <- matrix(data = c(n,a,b,a,b,c,b,c,d), nrow = 3, ncol = 3) noti <- matrix(data = c(e,f,g), nrow = 3, ncol = 1) S <- solve(ma,noti); S # [,1] # [1,] 2.478571 # [2,] 2.359286 # [3,] 1.860714 # i dati sono approssimati da x -> 2.48+2.36*x+1.86*x^2 F <- function(x) S[1]+S[2]*x+S[3]*x^2 curve(F,add=TRUE,col="blue") # # Regressione polinomiale di 3º grado: d1 <- sum(x^5); d2 <- sum(x^6) g1 <- sum(x^3*y) ma <- matrix(data = c(n,a,b,c, a,b,c,d, b,c,d,d1, c,d,d1,d2), nrow = 4, ncol = 4) noti <- matrix(data = c(e,f,g,g1), nrow = 4, ncol = 1) S1 <- solve(ma,noti); S1 # [,1] # [1,] 2.25079365 # [2,] 3.39947090 # [3,] 1.29126984 # [4,] 0.07592593 # i dati sono approssimati da x -> 2.25+3.40*x+1.29*x^2+0.076*x^3 F1 <- function(x) S1[1]+S1[2]*x+S1[3]*x^2+S1[4]*x^3 curve(F1,add=TRUE,col="red") F(x); F1(x) # i valori quasi coincidono # 2.478571 6.698571 14.640000 26.302857 41.687143 60.792857 # 2.250794 7.017460 14.822222 26.120635 41.368254 61.020635Per gli altri dati, in modo simile, avremmo ottenuto:
S1 <- solve(ma,noti); S1 # [,1] # [1,] 2.4603175 # [2,] 24.4312169 # [3,] -7.4920635 # [4,] 0.8703704 F1 <- function(x) S1[1]+S1[2]*x+S1[3]*x^2+S1[4]*x^3 curve(F1,add=TRUE,col="red")L'approssimazione polinomiale di 2º grado e quella di 3º sono molto differenti. Senza sapere quale tipo di funzione "usare", in questo caso non possiamo decidere come approssimare i dati.