2015-06-04 9 views
5

Ho alcuni dati di calcio annuali che vorrei testare per vedere se determinate metriche di squadra sono ripetibili nel prossimo anno. I miei dati sono in un data.frame e simile a questa:Scatterplot di correlazione dei dati anno su anno in R utilizzando ggplot2

    y2003 y2004 y2005 
Team 1   51.95455 51.00000 53.59091 
Team 2   54.18182 56.31818 49.09091 
Team 3   48.68182 46.86364 49.22727 
Team 4   50.86364 47.68182 48.72727 

Quello che voglio essere in grado di fare è dispersione questo con "Anno n" sulla xe "n Anno + 1" sulla l'asse y. Quindi per esempio 2003 vs 2004, 2004 vs 2005, 2005 vs 2006 ecc. Tutti sulla stessa trama.

Vorrei quindi essere in grado di tracciare una linea di miglior adattamento per vedere quanto sia forte la correlazione, se sia ripetibile o meno.

Qual è il modo migliore per farlo in R con ggplot2? Posso ottenere la trama iniziale con:

p=ggplot(df,aes(y2003,y2004)) 
p + geom_point() 

Quindi devo semplicemente aggiungerli tutti manualmente? Esiste una funzione integrata per questo genere di cose? E se li aggiungo tutti uno per uno, come posso ottenere il miglior adattamento?

risposta

3

Volete un frame di dati con una riga per ogni combinazione di squadra l'anno, contenente i dati per quell'anno e l'anno successivo e il nome della squadra. Si può effettivamente ottenere questo senza split-applica-combinazione manipolazione utilizzando le funzioni di base R:

(to.plot <- data.frame(yearN=unlist(df[-ncol(df)]), 
         yearNp1=unlist(df[-1]), 
         team=rep(row.names(df), ncol(df)-1))) 
#   yearN yearNp1 team 
# y20031 51.95455 51.00000 Team1 
# y20032 54.18182 56.31818 Team2 
# y20033 48.68182 46.86364 Team3 
# y20034 50.86364 47.68182 Team4 
# y20041 51.00000 53.59091 Team1 
# y20042 56.31818 49.09091 Team2 
# y20043 46.86364 49.22727 Team3 
# y20044 47.68182 48.72727 Team4 

Fondamentalmente questo codice converte tutti ma l'ultima colonna di df in un vettore (utilizzando unlist), la loro memorizzazione in variabile yearN. L'anno successivo può essere ottenuto afferrando tutto tranne la prima colonna di df in un vettore. Infine, il nome del team può essere ottenuto come sequenza ripetuta dei nomi delle righe di df.

Ottenere una linea di best fit è un semplice modello di regressione lineare:

(coefs <- coef(lm(yearNp1~yearN, data=to.plot))) 
# (Intercept)  yearN 
# 28.3611927 0.4308978 

Ora ggplot può essere utilizzato come di consueto per il tracciato:

library(ggplot2) 
ggplot(to.plot, aes(x=yearN, y=yearNp1, col=team)) + geom_point() + 
    geom_abline(intercept=coefs[1], slope=coefs[2]) 

enter image description here

3

il necessario per rendere i dati ggplot "amichevole", allora è facile:

df <- read.table(text=" y2003 y2004 y2005 
Team1 51.95455 51 53.59091 
       Team2 54.18182 56.31818 49.09091 
       Team3 48.68182 46.86364 49.22727 
       Team4 50.86364 47.68182 48.72727 
       ") 

#make data ggplot friendly 
mycomb <- combn(colnames(df),2) 
plotDat <- do.call(rbind, 
        lapply(1:ncol(mycomb),function(i){ 
        res <- df[,mycomb[,i]] 
        colnames(res) <- c("x","y") 
        res$Group <- paste(mycomb[,i],collapse="-") 
        res 
        })) 

#plot 
library(ggplot2) 
ggplot(plotDat,aes(x,y,col=Group)) + 
    geom_point() 

enter image description here