假设在一个包含相同信息的数据集中有两个变量,例如“男性”和“女性”(假设只有2个性别且没有缺失数据)。我如何测试两列包含相同的信息,从而允许我删除其中的一个?R:测试变量是否包含相同的信息
我想过检查包含它们的矩阵的排名,但显然这样的矩阵是满秩的,即使列明显依赖于对方。
编辑:我的意思是两个变量,如下列:
M F
1 0
1 0
0 1
0 1
1 0
显然同样的信息包含这两个变量中。我该如何测试?
假设在一个包含相同信息的数据集中有两个变量,例如“男性”和“女性”(假设只有2个性别且没有缺失数据)。我如何测试两列包含相同的信息,从而允许我删除其中的一个?R:测试变量是否包含相同的信息
我想过检查包含它们的矩阵的排名,但显然这样的矩阵是满秩的,即使列明显依赖于对方。
编辑:我的意思是两个变量,如下列:
M F
1 0
1 0
0 1
0 1
1 0
显然同样的信息包含这两个变量中。我该如何测试?
编辑
根据您的澄清,你可以使用成对的相关检测数据列之间的正,负相关,例如:
# create example data matrix matrix; add a fourth column that is inverse
# of the third one
> set.seed(1)
> x <- matrix(sample(0:1, 15, replace=TRUE), ncol=3)
> x <- cbind(x, ifelse(x[,3] == 0, 1, 0))
> x
[,1] [,2] [,3] [,4]
[1,] 0 1 0 1
[2,] 0 1 0 1
[3,] 1 1 1 0
[4,] 1 1 0 1
[5,] 0 0 1 0
其次,构建相关矩阵。对角线因为忽略自相关而被设置为零。
然后,我们测试每个列以查看与其他列的相关性的最大绝对值是否等于1,这表示列中包含相同的信息。
> cormat <- cor(x)
> diag(cormat) <- 0
> apply(cormat, 2, function(x) { max(abs(x)) == 1 })
[1] FALSE FALSE TRUE TRUE
我不是指相同的列,我的意思是列在哪里,例如,v1 = 1 - v2 – Noah
您是否考虑过使用两列之间的相关性? –
@Noah,更新以反映澄清。以上是基于我原来的答案的第二个建议。 –
也许这样的事?
x = rep(c("Male"), each = 10)
y = rep(c("Female"),each = 10)
fm = matrix(data = c(x,y), ncol = 2)
fm[,1] == fm[,2]
不,这只是测试一列中的每个值是否等于另一列中的相应值。我想测试变量是否在信息中是多余的,而不是在价值上相等。 – Noah
嗨,诺亚,你能举个例子说明你的意思吗?你的意思是这些列是相同的(相同的值,相同的顺序),或者说它们具有相同的因子水平? –
如果你想使用矩阵的等级,你需要添加一列1。如果添加该值,那么即使有三列,结果矩阵的秩仍然只有2而不是3。 – Dason
对于所给出的示例,它们将具有1或-1的相关性,因此您可以使用apply(cor(df),1,function(x){any(abs(x)== 1) })',但如果有多个,你必须去看'cor(df)'来弄清楚它们是如何配对的。 – alistaire