这是我之前关于大型数据集的帖子(covariance matrix by group)的后续问题。我有6个变量(HML,RML,FML,TML,HFD和BIB),我正在尝试为它们创建特定于组的协方差矩阵(基于变量Group)。但是,我在这6个变量中有很多缺失的数据(不在Group中),我需要能够在分析中使用这些数据 - 删除或省略行不是本研究的好选择。
我将数据集缩小为感兴趣的实际变量的矩阵:
>MMatrix = MMatrix2[1:2187,4:10]
这适用于计算整体协方差矩阵:
>cov(MMatrix, use="pairwise.complete.obs",method="pearson")
因此,要按组列出协方差矩阵,我将原始数据矩阵转换为数据帧(因此我可以使用$指示符):
>CovDataM <- as.data.frame(MMatrix)
然后,我使用以下建议的代码按组获取协方差,但它一直返回NULL:
>cov.list <- lapply(unique(CovDataM$group),function(x)cov(CovDataM[CovDataM$group==x,-1]))
我认为这是因为我的NAs,所以我尝试添加use =“pairwise.complete.obs”以及使用=“na.or.complete”(当绝望时)到代码的末尾,它只返回NULL。我在某处读到“pairwise.complete.obs”只能在method =“pearson”时使用,但最后添加它也没有任何区别。我需要按组获取这些变量的协方差矩阵,并且如果可能的话,包含所有可用的数据,我会陷入困境。
答案 0 :(得分:1)
以下是一个可以帮助你的例子:
# 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
是一个包含四个元素的列表(在本例中),它们对应于四个组中每个组的协方差矩阵。
答案 1 :(得分:0)
你的问题是,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")
似乎工作正常。希望能够概括你的问题。