R语言计算Iris鸢尾花数据集协方差矩阵出现NA值问题
R语言计算Iris数据集协方差矩阵出现NA的解决方法
问题根源
Iris内置数据集总共仅有150行观测,你代码中两次使用1:1000作为行索引取值,会生成850条不存在的空值(NA),空值在后续矩阵运算中会传递,最终导致协方差矩阵全为NA。
修正方案
将所有行索引的取值范围调整为不超过150即可,修正后的完整代码如下:
library(ggplot2) library(dplyr) dim(iris) head(iris) numIris <- iris %>% select_if(is.numeric) plot(numIris[1:100,]) # 原错误写法:Xraw <- numIris[1:1000,] Xraw <- numIris[1:150,] plot(iris[1:150,-c(5)]) # 物种名称是第5列,此处排除该列 # 原错误写法:Xraw = iris[1:1000,-c(5)] Xraw = iris[1:150,-c(5)] # 此处排除第5列即物种列 # 首先计算协方差需要对每列做去均值处理 X = scale(Xraw, scale = FALSE) head(X) Xs <- scale(Xraw, scale = TRUE) head(Xs) covMat = (t(X)%*%X)/ (nrow(X)-1) head(covMat)
你也可以直接调用R内置的cov()函数计算协方差矩阵,和手动计算的结果完全一致:
# 直接调用内置函数计算 covMat_builtin <- cov(Xraw) head(covMat_builtin)
内容的提问来源于stack exchange,提问作者Frank Telles
相关产品推荐
相关产品推荐

