R中的vegan包的varpart函数检测因子和数值变量之间的意外共线性

时间:2019-05-01 03:55:18

标签: r vegan

我正在尝试对某些响应数据进行变异分区分析。我有三个约束变量,一个数字变量和两个因子,它们是我正在编码的虚拟变量,目的是有意捕获与响应数据中的预测信号相关的变化。我遇到的问题是varpart()函数正在检测因子变量之一和数值变量之间的共线性。我相信这是因为数字变量被编码为离散值,并且这些值之间的“跳跃”对应于不同因子水平之间的跳跃。

以下是有问题的两个变量的示例:

    > var1 <- unlist(lapply(1:5, function(x){rep(x, 20)}))
    > var1
   [1] 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 3 3 3
   [44] 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 5 5 5 5 5 5
   [87] 5 5 5 5 5 5 5 5 5 5 5 5 5 5
   var2 <- as.factor(unlist(lapply(letters[1:5], FUN = function(x){rep(x, 20)})))
    > var2
   [1] a a a a a a a a a a a a a a a a a a a a b b b b b b b b b b b b b b b b b b b b c c c
   [44] c c c c c c c c c c c c c c c c c d d d d d d d d d d d d d d d d d d d d e e e e e e
   [87] e e e e e e e e e e e e e e
   Levels: a b c d e

以上,var1旨在捕获响应数据中预测梯度的变化,该变化每20个单位变化一次。例如,如上所述,这可以表示5个位置的线性排列,每个位置抽出20个样本。相反,var2旨在捕获每个站点唯一的变化,因此它表示为5个站点中每个站点具有不同级别的因子,每20个单位又发生一次变化。

(我还有一个单独的变量,该变量在设计上与以下任何一个都不相关:var3 <- as.factor(rep(c(rep("type1", 10), rep("type2", 10)), 5))

以下是一些样本响应数据:

    response <- sapply(1:100, function(x){x <- rbinom(100, 2, .5)})
    > response[1:5, 1:5]
    [,1] [,2] [,3] [,4] [,5]
    [1,]    2    2    1    1    1
    [2,]    1    1    2    1    2
    [3,]    2    1    1    1    0
    [4,]    1    0    2    1    1
    [5,]    2    1    1    0    1

执行varpart(response, var1, var2, var3)时,出现以下警告消息:

    Warning messages:
    1: collinearity detected in cbind(X1,X2): mm = 5, m = 4 
    2: collinearity detected in cbind(X1,X2,X3): mm = 6, m = 5 
    3: collinearity detected: redundant variable(s)  between tables X1, X2
    results are probably incorrect: remove redundant variable(s) and repeat the analysis 
    4: collinearity detected: redundant variable(s)  between tables X1, X2, X3
    results are probably incorrect: remove redundant variable(s) and repeat the analysis

此外,var1对总变化的单个贡献恰好为零,这是出乎意料的(尽管这些是模拟数据)。

为什么在因子和数字变量之间出现这种共线性? varpart无法处理此设计吗?

1 个答案:

答案 0 :(得分:0)

看看你从中得到什么

table(var1, var2)

您的两个变量(var1var2是相同的)–仅以不同的方式(数字,字母)编码。 varpart确实可以处理此设计,并且发现如果要将变体分解为两个相同的部分,将无能为力。