在R中生成样本协方差矩阵

时间:2017-09-21 04:26:54

标签: r statistics

考虑由Seretosa,Versicolor和Virginica组成的虹膜数据集。对于4个变量有50个观察值:萼片长度,萼片宽度,花瓣长度和花瓣宽度。如何使用R计算每个组的样本协方差矩阵?

3 个答案:

答案 0 :(得分:3)

这是另一种方式......

lapply(split(iris[,-5],iris$Species),cov)

$setosa
             Sepal.Length Sepal.Width Petal.Length Petal.Width
Sepal.Length   0.12424898 0.099216327  0.016355102 0.010330612
Sepal.Width    0.09921633 0.143689796  0.011697959 0.009297959
Petal.Length   0.01635510 0.011697959  0.030159184 0.006069388
Petal.Width    0.01033061 0.009297959  0.006069388 0.011106122

$versicolor
             Sepal.Length Sepal.Width Petal.Length Petal.Width
Sepal.Length   0.26643265  0.08518367   0.18289796  0.05577959
Sepal.Width    0.08518367  0.09846939   0.08265306  0.04120408
Petal.Length   0.18289796  0.08265306   0.22081633  0.07310204
Petal.Width    0.05577959  0.04120408   0.07310204  0.03910612

$virginica
             Sepal.Length Sepal.Width Petal.Length Petal.Width
Sepal.Length   0.40434286  0.09376327   0.30328980  0.04909388
Sepal.Width    0.09376327  0.10400408   0.07137959  0.04762857
Petal.Length   0.30328980  0.07137959   0.30458776  0.04882449
Petal.Width    0.04909388  0.04762857   0.04882449  0.07543265

答案 1 :(得分:1)

您可以在基数R中执行此操作,以获取每个组的协方差矩阵的命名列表:

tapply(seq_along(iris[[5]]), iris[[5]], FUN = function(ind) cov(iris[ind, -5]))

答案 2 :(得分:0)

以下是使用lapplydplyr管道的解决方案:

data(iris)
library(dplyr)

l = lapply(unique(iris$Species), function(s) {
    my.matrix = iris %>% filter(Species == s) %>% select(-Species) %>% as.matrix
    return(cov(my.matrix))
})

结果l是一个协方差矩阵列表,其种类与它们在虹膜数据集中出现的顺序相同。