R 如何从带有虚拟变量的数据中找到相关性和协方差矩阵?

R 如何从带有虚拟变量的数据中找到相关性和协方差矩阵?,r,matrix,statistics,correlation,R,Matrix,Statistics,Correlation,我有一个数据集,它的列名是性别、智商和大脑质量。当然,只有性别是一个分类变量,所以我通过将其设置为Gender=factor(Gender)为其分配了一个虚拟变量 但是,我想找到协方差矩阵和相关矩阵。我知道我可以使用cov2cor(V)来获得相关矩阵,但是如何从这些数据中获得协方差矩阵呢?我认为我不能只接受var(data),因为存在一个伪变量 如果有人能帮忙,我将不胜感激。谢谢。我不明白您为什么要在相关性计算中包含因子变量。我建议删除该变量,仅对较小的data.frame计算cor: set.

我有一个数据集,它的列名是性别、智商和大脑质量。当然,只有性别是一个分类变量,所以我通过将其设置为
Gender=factor(Gender)
为其分配了一个虚拟变量

但是,我想找到协方差矩阵和相关矩阵。我知道我可以使用
cov2cor(V)
来获得相关矩阵,但是如何从这些数据中获得协方差矩阵呢?我认为我不能只接受
var(data)
,因为存在一个伪变量


如果有人能帮忙,我将不胜感激。谢谢。

我不明白您为什么要在相关性计算中包含因子变量。我建议删除该变量,仅对较小的data.frame计算
cor

set.seed(1)
n <- 100
df <- data.frame(Gender=sample(c("male", "female"), n, replace=TRUE), IQ=rnorm(n, mean=100, sd=10), Brain_Mass=rnorm(n, mean=5000, sd=500))
head(df)

COV <- cov(df[,2:3])
COR <- cor(df[,2:3])
COV; COR

在分类数据和连续数据之间使用相同的相关性(或协方差)计算不是最好的方法。连续数据应使用皮尔逊相关性,分类数据应使用斯皮尔曼相关性。在某些情况下,这两种方法可能会产生类似的结果

对于协方差,请尝试:

cov(data_set,method='spearman') 

根据数据类型选择的方法而定

对于相关性,将
cov()
函数替换为
cor()

您拥有的因子变量需要事先转换为数值:

gender <- as.numeric(gender)

gender即使没有什么(技术)阻止你计算连续变量和二分法变量之间的皮尔逊或斯皮尔曼相关性,我也会看看所谓的“”,一个相当奇特的名字,它实际上与皮尔逊相关性非常密切,但有一点扭曲


对此有一种解释;)

如果您有正当理由计算连续数据和分类数据组合的相关矩阵(例如需要将其输入到另一个函数),则一种方法是使用
model.matrix
函数将因子转换为其虚拟变量编码,然后将结果传递给
cor
或其他函数,以计算相关性或协方差:

> cor(model.matrix(~.-1,data=iris[,3:5]))
                  Petal.Length Petal.Width Speciessetosa Speciesversicolor Speciesvirginica
Petal.Length         1.0000000   0.9628654    -0.9227654         0.2017545        0.7210109
Petal.Width          0.9628654   1.0000000    -0.8873437         0.1178988        0.7694449
Speciessetosa       -0.9227654  -0.8873437     1.0000000        -0.5000000       -0.5000000
Speciesversicolor    0.2017545   0.1178988    -0.5000000         1.0000000       -0.5000000
Speciesvirginica     0.7210109   0.7694449    -0.5000000        -0.5000000        1.0000000
> 

使用polycor软件包的hepcor功能。它根据变量类型使用适当的方法:连续、分类。工作起来很有魅力

下面是上面小插曲中代码的输出

Correlations/Type of Correlation:
       x1      x2         y1         y2
x1      1 Pearson Polyserial Polyserial
x2 0.5577       1 Polyserial Polyserial
y1 0.5537  0.7484          1 Polychoric
y2 0.6301  0.6274     0.6052          1

为了未来的观察者,我不认为使用
cov
(即使使用method=
spearman
)是不正确的。斯皮尔曼相关性适用于连续和有序数据,性别不属于这两种数据!
> cor(model.matrix(~.-1,data=iris[,3:5]))
                  Petal.Length Petal.Width Speciessetosa Speciesversicolor Speciesvirginica
Petal.Length         1.0000000   0.9628654    -0.9227654         0.2017545        0.7210109
Petal.Width          0.9628654   1.0000000    -0.8873437         0.1178988        0.7694449
Speciessetosa       -0.9227654  -0.8873437     1.0000000        -0.5000000       -0.5000000
Speciesversicolor    0.2017545   0.1178988    -0.5000000         1.0000000       -0.5000000
Speciesvirginica     0.7210109   0.7694449    -0.5000000        -0.5000000        1.0000000
> 
Correlations/Type of Correlation:
       x1      x2         y1         y2
x1      1 Pearson Polyserial Polyserial
x2 0.5577       1 Polyserial Polyserial
y1 0.5537  0.7484          1 Polychoric
y2 0.6301  0.6274     0.6052          1