Дискриминантный анализ с R - PullRequest
       5

Дискриминантный анализ с R

1 голос
/ 09 сентября 2011

Я выполнял дискриминантный анализ с использованием R. Код следующий:

fit <- lda(group~ A+C1_1+C2+D1a_1+D2_1+D3_1+D3_2+D3_3+E1a_1+E1b_1+E1b_2+E2_1+E3_1+E3_2+E3_3+F2+G_1+G_2+G_3+G_4+H1_1+H2a_1+H2b_1+H3_1+H4_1_1+H1_2+H2a_2+H2b_2+ H3_2+H4_1_2+J1_1+J2_1+J3_1+K1a+K2_1+K2_2+K2_3+K2_4,data=data1)

Но, к сожалению, я получил следующую ошибку:

Error in x - group.means[g, ] : non-conformable arrays

Это строка (data1) output:

'data.frame':   210 obs. of  133 variables:

 $ A               : int  1 1 1 1 1 1 1 2 1 2 ...

 $ C1_1            : int  22 29 12 12 25 15 30 20 30 15 ...
 $ C2              : int  2 2 2 2 2 2 2 1 2 2 ...
 $ D1a_1           : int  40 50 160 15 150 105 150 45 100 80 ...
 $ D2_1            : int  100 100 100 100 100 100 100 90 95 100 ...
 $ D3_1            : int  5 15 40 10 30 25 30 40 25 60 ...
 $ D3_2            : int  10 30 30 15 30 25 60 40 20 10 ...
 $ D3_3            : int  10 30 30 10 10 15 10 20 20 30 ...
 $ E1a_1           : int  80 25 140 30 150 120 80 30 100 100 ...
 $ E1b_1           : int  100 50 50 25 80 70 80 75 10 75 ...
 $ E1b_2           : int  0 50 50 75 20 30 20 25 90 25 ...
 $ E2_1            : int  20 60 75 70 60 80 75 100 60 80 ...
 $ E3_1            : int  5 20 20 5 30 20 25 25 10 30 ...
 $ E3_2            : int  10 20 40 15 30 20 50 50 10 30 ...
 $ E3_3            : int  10 20 15 10 10 20 25 25 10 40 ...
 $ G_1             : int  5 50 20 25 80 10 30 25 35 5 ...
 $ G_2             : int  0 10 50 50 10 10 30 30 30 10 ...
 $ G_3             : int  90 30 20 25 10 50 5 30 15 80 ...
 $ G_4             : int  5 10 10 0 0 30 35 15 20 5 ...
 $ H1_1            : int  1 3 3 2 3 2 3 3 2 3 ...
 $ H2a_1           : int  NA NA NA 1 NA 2 NA NA 1 NA ...

 $ H2b_1           : int  NA 2 1 NA 2 NA 1 1 NA 1 ...

 $ H3_1            : int  2 2 2 2 2 3 3 3 2 2 ...

 $ H4_1_1          : int  6 5 7 6 3 6 5 6 5 5 ...

 $ J1_1            : int  4 6 4 4 4 4 6 7 3 3 ...
 $ J2_1            : int  2 6 5 3 4 4 1 2 3 3 ...
 $ J3_1            : int  4 5 3 3 4 4 6 7 3 4 ...

 $ K1a             : int  2 2 2 2 2 2 2 2 1 1 ...

 $ K2_1            : int  NA NA NA NA NA NA NA NA 0 0 ...
 $ K2_2            : int  NA NA NA NA NA NA NA NA 1 0 ...
 $ K2_3            : int  NA NA NA NA NA NA NA NA 0 1 ...
 $ K2_4            : int  NA NA NA NA NA NA NA NA 0 0 ...

  [list output truncated

]]

Во-вторых, кто-нибудь может подсказать, как получить уровень значимости переменных, используемых в дискриминантном анализе.

1 Ответ

7 голосов
/ 09 сентября 2011

Работает нормально со случайно сгенерированным набором данных без значений NA:

set.seed(101)
z <- matrix(runif(210*133),nrow=210)
zz <- data.frame(A=sample(1:2,size=210,replace=TRUE),z)
m <- MASS::lda(A~.,data=zz)

Я могу воспроизвести ошибку, если добавлю достаточно NA s:

z2 <- z
z2[sample(length(z),size=2000)] <- NA
zz2 <- data.frame(A=sample(1:2,size=210,replace=TRUE),z2)
m <- MASS::lda(A~.,data=zz2)

в результате

Error in x - group.means[g, ] : non-conformable arrays

(если я выбью меньше, вместо этого я получу предупреждения о коллинеарности)

Для начала попробуйте удалить все переменные с любыми значениями NA(или тех, у кого их несколько) и посмотрите, сможете ли вы заставить его работать.

Для части вопроса о значении p: поиск в Google "+ r MASS lda дискриминантный анализ" приводит к http://www.statmethods.net/advstats/discriminant.html и предлагает (и предоставляет ссылку на) MANOVA для этих значений p.

Основываясь на небольшом поиске, похоже, что люди обычно используют MANOVA с лямбда Уилкса для тестов в контексте LDA: дляНапример, http://userwww.sfsu.edu/~efc/classes/biol710/discrim/discrim.pdf говорит

Анализ дискриминантной функции разбит на 2 этапа: (1) проверка значимости набора дискриминантных функций, и;(2) классификация.Первый шаг в вычислительном отношении идентичен MANOVA.

Они продолжают показывать пример использования лямбды Уилкса, хотя ?manova говорит, что тест Пиллаи-Бартлетта (который используется по умолчанию в manova) может быть лучше ... в любом случае, пройти тест довольно просто.

> summary(manova(z~zz$A),test="Wilks")
           Df   Wilks approx F num Df den Df Pr(>F)
zz$A        1 0.38164  0.92587    133     76 0.6545
Residuals 208     

Это, конечно, не совсем то, о чем вы просили - вы спросили (я думаю) о значимостиУровень связан с отдельными переменными , а не с общим тестом.Я могу представить, что вы могли бы что-то сделать с помощью надлежащим образом скорректированной множественности логистической регрессии, но это превращается в статистический, а не в R-вопрос.Если вы не получите дальнейших ответов, вы можете задать соответствующий вопрос по http://stats.stackexchange.com, ссылаясь на этот вопрос ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...