Функция varpart пакета vegan в R, обнаруживающая неожиданную коллинеарность между фактором и числовой переменной - PullRequest
0 голосов
/ 01 мая 2019

Я пытаюсь выполнить анализ разделения вариантов на некоторых данных ответа.У меня есть три ограничивающие переменные, одна числовая переменная и два фактора, которые являются фиктивными переменными, которые я кодирую, чтобы преднамеренно фиксировать вариации, связанные с предсказанными сигналами в данных ответа.У меня проблема в том, что функция 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 голосов
/ 03 мая 2019

Посмотрите, что вы получаете от

table(var1, var2)

Ваши две переменные (var1 и var2 идентичны) - кодируются только по-разному (цифры, буквы).varpart действительно может справиться с этим дизайном, и обнаруживает, что ничего не поделаешь, если вы хотите разложить ваш вариант на две идентичные части.

...