这是我之前关于大型数据集的文章(按组的协方差矩阵)的后续问题。我有6个变量(HML、RML、FML、TML、HFD和BIB),我正试图为它们创建特定于组的协方差矩阵(基于变量group)。然而,我在这6个变量中有很多缺失的数据(不在组中),我需要能够在分析中使用这些数据——逐行删除或省略对这项研究来说不是一个好的选择。
我将数据集缩小为感兴趣的实际变量矩阵:
>MMatrix = MMatrix2[1:2187,4:10]
这对于计算具有以下的总体协方差矩阵来说效果良好:
>cov(MMatrix, use="pairwise.complete.obs",method="pearson")
因此,为了按组列出协方差矩阵,我将原始数据矩阵转换为一个数据帧(这样我就可以使用$indicator),其中包含:
>CovDataM <- as.data.frame(MMatrix)
然后,我使用以下建议的代码按组获取协变,但它一直返回NULL:
>cov.list <- lapply(unique(CovDataM$group),function(x)cov(CovDataM[CovDataM$group==x,-1]))
我认为这是因为我的na,所以我尝试在代码末尾添加use="pairwise.complete.obs"和use="na.or.complete"(当绝望时),但它只返回NULL。我在某个地方读到,只有当method="pearson"时才能使用"pairwise.complete.obs",但在末尾添加它也没有什么区别。我需要按组获得这些变量的协方差矩阵,如果可能的话,包括所有可用的数据,我就陷入了困境。
下面是一个应该让你开始的例子:
# Create some fake data
m <- matrix(runif(6000), ncol=6,
dimnames=list(NULL, c('HML', 'RML', 'FML', 'TML', 'HFD', 'BIB')))
# Insert random NAs
m[sample(6000, 500)] <- NA
# Create a factor indicating group levels
grp <- gl(4, 250, labels=paste('group', 1:4))
# Covariance matrices by group
covmats <- by(m, grp, cov, use='pairwise')
结果对象covmats
是一个具有四个元素的列表(在这种情况下),这些元素对应于四个组中每个组的协方差矩阵。
您的问题是lapply对您的列表处理得很奇怪。如果你运行这个代码(我希望它与你的代码非常相似):
CovData <- matrix(1:75, 15)
CovData[3,4] <- NA
CovData[1,3] <- NA
CovData[4,2] <- NA
CovDataM <- data.frame(CovData, "group" = c(rep("a",5),rep("b",5),rep("c",5)))
colnames(CovDataM) <- c("a","b","c","d","e", "group")
lapply(unique(as.character(CovDataM$group)), function(x) print(x))
您可以看到,lapply正在以与您预期不同的方式评估列表。NAs似乎不是问题所在。当我运行时:
by(CovDataM[ ,1:5], CovDataM$group, cov, use = "pairwise.complete.obs", method = "pearson")
它似乎运行良好。希望这能概括到你的问题。