考虑由Seretosa,Versicolor和Virginica组成的虹膜数据集。对于4个变量有50个观察值:萼片长度,萼片宽度,花瓣长度和花瓣宽度。如何使用R计算每个组的样本协方差矩阵?
答案 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)
以下是使用lapply
和dplyr
管道的解决方案:
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
是一个协方差矩阵列表,其种类与它们在虹膜数据集中出现的顺序相同。