Mais je ne comprends pas exactement comment t (D) %% D est construit.
Il s'agit d'un produit à matrice croisée, une forme spéciale de multiplication matricielle. Si vous ne comprenez pas ce qu'il fait, considérer la boucle R suivante pour vous aider à absorber ceci:
DtD <- matrix(0, nrow = ncol(D), ncol = ncol(D))
for (j in 1:ncol(D))
for (i in 1:ncol(D))
DtD[i, j] <- sum(D[, i] * D[, j])
Note, personne ne va en réalité écrire boucle R pour cela; C'est juste pour vous aider à comprendre l'algorithme.
originale Réponse
Supposons que nous ayons une matrice X
, où chaque colonne donne des observations d'une variable aléatoire spécifique, normalement, nous utilisons simplement la fonction de base R cov(X)
pour obtenir la matrice de covariance.
Maintenant, vous voulez écrire une fonction de covariance vous-même; Ce n'est pas difficile non plus (je l'ai fait il y a longtemps comme exercice). Il faut 3 étapes:
- centrage de colonne (c'est-à-dire, dé-moyenne pour toutes les variables);
- produit croisé de matrice;
- moyenne (sur
nrow(X) - 1
et non nrow(X)
pour l'ajustement de la polarisation).
Ce code court le fait:
crossprod(sweep(X, 2L, colMeans(X)))/(nrow(X) - 1L)
Tenir compte un petit exemple
set.seed(0)
## 3 variable, each with 10 observations
X <- matrix(rnorm(30), nrow = 10, ncol = 3)
## reference computation by `cov`
cov(X)
# [,1] [,2] [,3]
#[1,] 1.4528358 -0.20093966 -0.10432388
#[2,] -0.2009397 0.46086672 -0.05828058
#[3,] -0.1043239 -0.05828058 0.48606879
## own implementation
crossprod(sweep(X, 2L, colMeans(X)))/(nrow(X) - 1L)
# [,1] [,2] [,3]
#[1,] 1.4528358 -0.20093966 -0.10432388
#[2,] -0.2009397 0.46086672 -0.05828058
#[3,] -0.1043239 -0.05828058 0.48606879
Que faire si vous voulez obtenir la matrice de corrélation?
Il existe plusieurs façons.Si nous voulons obtenir directement, faire:
crossprod(scale(X))/(nrow(X) - 1L)
# [,1] [,2] [,3]
#[1,] 1.0000000 -0.2455668 -0.1241443
#[2,] -0.2455668 1.0000000 -0.1231367
#[3,] -0.1241443 -0.1231367 1.0000000
Si nous voulons d'abord obtenir covariance, puis (symétriquement) RESCALE par la racine diagonale pour obtenir une corrélation, nous pouvons faire:
## covariance first
V <- crossprod(sweep(X, 2L, colMeans(X)))/(nrow(X) - 1L)
## symmetric rescaling
V/tcrossprod(diag(V)^0.5)
# [,1] [,2] [,3]
#[1,] 1.0000000 -0.2455668 -0.1241443
#[2,] -0.2455668 1.0000000 -0.1231367
#[3,] -0.1241443 -0.1231367 1.0000000
Nous peut également utiliser une fonction de service de R cov2cor
pour convertir covariance à la corrélation:
cov2cor(V)
# [,1] [,2] [,3]
#[1,] 1.0000000 -0.2455668 -0.1241443
#[2,] -0.2455668 1.0000000 -0.1231367
#[3,] -0.1241443 -0.1231367 1.0000000
@ZheyuanLi, oui, il est tout à fait clair maintenant. Merci pour votre réponse élaborée! –