2015-06-07 25 views
7

La funzione standard cov calcola la matrice di covarianza del campione, voglio avere la matrice di covarianza della popolazione.Come ridefinire cov per calcolare la matrice di covarianza della popolazione

ho provato la seguente:

cov.pop <- function(x,y=NULL) { 
    cov(x,y)*(length(x)-1)/length(x) 
} 

> sapply(list(Apple,HP,Microsoft),cov.pop,y=Apple) #correct 
[1] 0.7861672 0.1363396 0.2223303 
> sapply(list(Apple,HP,Microsoft),cov.pop,y=HP) #correct 
[1] 0.13633964 0.09560376 0.05226032 
> sapply(list(Apple,HP,Microsoft),cov.pop,y=Microsoft) #correct 
[1] 0.22233028 0.05226032 0.13519964 
> cov.pop(cbind(Apple,HP,Microsoft)) #not correct 
       Apple   HP Microsoft 
Apple  0.8444018 0.14643887 0.23879919 
HP  0.1464389 0.10268552 0.05613145 
Microsoft 0.2387992 0.05613145 0.14521443 

La mia domanda
C'è un modo semplice per modificare la funzione cov.pop per ottenere la matrice di covarianza popolazione corretta?

risposta

5

immagino i risultati sono diversi perché il length nel matrix (cioè cbind(Apple, HP, Microsoft) e la length in ogni elemento list non è la stessa

cov.pop <- function(x,y=NULL) { 
    cov(x,y)*(NROW(x)-1)/NROW(x) 
    } 

Utilizzando un esempio di dati

set.seed(24) 
Apple <- rnorm(140) 
HP <- rnorm(140) 
Microsoft <- rnorm(140) 

cov.pop(cbind(Apple,HP,Microsoft)) 
#    Apple   HP Microsoft 
#Apple  0.946489639 0.006511604 0.02518080 
#HP  0.006511604 1.015532869 0.04940075 
#Microsoft 0.025180805 0.049400745 1.08388185 

sapply(list(Apple,HP,Microsoft),cov.pop,y=Apple) 
#[1] 0.946489639 0.006511604 0.025180805 

sapply(list(Apple,HP,Microsoft),cov.pop,y=HP) 
#[1] 0.006511604 1.015532869 0.049400745 

sapply(list(Apple,HP,Microsoft),cov.pop,y=Microsoft) 
#[1] 0.02518080 0.04940075 1.08388185 
+0

+1 e accettato: è fantastico, grazie! Ho pensato a qualcosa del genere ma "NROW (x)" in realtà fa il trucco :-) – vonjd

+1

@vonjd Felice di sapere che ha funzionato. Grazie per il feedback – akrun