выполнить LDA с 3 классами в R

У меня есть три класса со средним значением

mu1 <- matrix(c(3, 1), nrow=2)
mu2 <- matrix(c(4, 3), nrow=2)
mu3 <- matrix(c(8, 2), nrow=2)

и ковариация

cov <- matrix(c(.5, .3, .3, .5), nrow=2, ncol=2)

Я хотел бы смоделировать около 100 наблюдений из каждого класса и выполнить LDA. сначала я сделал три матрицы со 100 наблюдениями.

x1 <- matrix(c(rmvnorm(100, mean=mu1, sigma=cov), matrix("x1", ncol=1, nrow=100)), ncol=3)
x2 <-matrix(c(rmvnorm(100, mean=mu2, sigma=cov), matrix("x2", ncol=1, nrow=100)), ncol=3)
x3 <- matrix(c(rmvnorm(100, mean=mu3, sigma=cov), matrix("x3", ncol=1, nrow=100)), ncol=3)

и сделал их фреймом данных и связал его вместе.

d1 <- data.frame(x1)
d2 <- data.frame(x2)
d3 <- data.frame(x3)
alld <- rbind(d1, d2, d3)

теперь я хотел бы выполнить lda с кодом

lda.x1 <- lda(alld[,3]~alld[,1]+alld[,2], data=alld)

здесь... Я получил предупреждающее сообщение и странный результат. пожалуйста помогите мне спасибо


person user3358686    schedule 07.10.2014    source источник
comment
Что такое предупреждение? Чем странны результаты?   -  person Olli J    schedule 07.10.2014
comment
Предупреждающее сообщение: в lda.default(x, grouping,...): переменные коллинеарны   -  person user3358686    schedule 07.10.2014


Ответы (1)


Ваши группы находятся на линии, которая отключается lda (см. plot(alld[, 1], alld[, 2], col = alld[, 3]). Я немного модифицировал ваш код и добавил немного шума в средства.

set.seed(357)
mu1 <- sample(1:10, 2)
mu2 <- sample(1:10, 2)
mu3 <- sample(1:10, 2)

cov <- matrix(c(.5, .3, .3, .5), nrow=2, ncol=2)

require(mvtnorm)
x1 <- rmvnorm(100, mean= mu1, sigma=cov)
x2 <- rmvnorm(100, mean= mu2, sigma=cov)
x3 <- rmvnorm(100, mean= mu3, sigma=cov)

alld <- data.frame(rbind(x1, x2, x3))
alld$col <- rep(1:3, each = 100)
names(alld) <- c("a", "b", "col")
plot(b ~ a, data = alld, col = alld$col)

mdl <- lda(col ~ a + b, data = alld)
plot(mdl)
points(predict(mdl)$x, cex = 0.5, pch = "+")
person Roman Luštrik    schedule 07.10.2014