Задачи с точками и применение R для линейного дискриминантного анализа

У меня есть вопрос по кодированию, который возникает при выполнении некоторых упражнений по линейному дискриминантному анализу. Мы используем данные Iris:

## Read in dataset, set seed, load package
Iris <- iris[,-(1:2)]
grIris <- as.integer(iris[,"Species"])
set.seed(16)
library(MASS)

## Read n
n <- nrow(Iris)

Как видите, мы удаляем первый и второй столбец радужной оболочки. Что я хочу сделать, так это загрузить эти данные с помощью линейного дискриминантного анализа, вот мой код:

ind <- replicate(B,sample(seq(1:n),n,replace=TRUE))

Это генерирует индексы, которые я хочу использовать. Примечание B - это большое число, например. 1000. Теперь я хочу использовать apply, но почему следующий код не работает?

bst.sample <- apply(ind,2,lda(Species~Petal.Length+Petal.Width,data=Iris[ind,]))

где Species, Petal.Length и т. д. — это данные по радужной оболочке. Если я использую цикл for, все работает нормально, но, конечно, я хотел бы реализовать его более элегантным способом.

Мой второй вопрос касается points. Я также хотел рассчитать предполагаемые средства, которые я сделал с помощью следующего кода

est.lda <- vector("list",B)
est.qda <- vector("list",B)
mu_hat_1 <- mu_hat_2 <- mu_hat_3 <- matrix(0,ncol=B,nrow=2)
for (i in 1:B){
  est.lda[[i]] <- lda(Species~Petal.Length+Petal.Width,data=Iris[ind[,i],])
  mu_hat_1[,i] <- est.lda[[i]]$means[1,]
  mu_hat_2[,i] <- est.lda[[i]]$means[2,]
  mu_hat_3[,i] <- est.lda[[i]]$means[3,]
  est.qda[[i]] <- qda(Species~Petal.Length+Petal.Width,data=Iris[ind[,i],])

}

plot(mu_hat_1[1,],mu_hat_1[2,],pch=4)
points(mu_hat_2[1,],mu_hat_2[2,],pch=4,col=2)
points(mu_hat_3[1,],mu_hat_3[2,],pch=4,col=3)

График в конце должен показать три области с ожидаемым средним значением трех классов. Однако показан только первый сюжет.

Спасибо за помощь.


person math    schedule 04.08.2013    source источник
comment
Что значит не работает? Что вы ожидаете на выходе и что вы получаете?   -  person Carl Witthoft    schedule 04.08.2013
comment
R чувствителен к регистру, поэтому сначала вы ссылаетесь на iris, а затем определяете grIris, а затем используете nrow(Iris) там, где Iris не определена. Я бы начал с этого.   -  person Ken Knoblauch    schedule 04.08.2013
comment
@KenKnoblauch Iris определяется в самом верху.   -  person Roland    schedule 04.08.2013


Ответы (1)


B <- 10
ind <- replicate(B,sample(seq(1:n),n,replace=TRUE))

#you need to pass a function to apply
bst.sample <- apply(ind,2, 
                function(i) lda(Species~Petal.Length+Petal.Width,data=Iris[i,]))
#extract means
bst.means <- lapply(bst.sample,function(x) x$means)

#bind means into array
library(abind)
bst.means <- do.call(function(...) abind(..., along=3), bst.means)

#you need to make sure that alle points are inside the axis limits
plot(bst.means[1,1,],bst.means[1,2,], 
     xlim=range(bst.means[,1,]), ylim=range(bst.means[,2,]), 
     xlab=dimnames(bst.means)[[2]][1],ylab=dimnames(bst.means)[[2]][2],
     col=1)
points(bst.means[2,1,],bst.means[2,2,], col=2)
points(bst.means[3,1,],bst.means[3,2,], col=3)
legend("topleft", legend=dimnames(bst.means)[[1]], col=1:3, pch=1)

введите здесь описание изображения

person Roland    schedule 04.08.2013
comment
ах! теперь я вижу свою ошибку. lda не является функцией. Я думал, что apply знает, что я хочу применить lda ко всем инд. Большое спасибо, Роланд. - person math; 04.08.2013
comment
lda — это функция. Но вы не передали функцию apply, а попытались передать возвращаемое функцией значение. - person Roland; 04.08.2013
comment
Ты быстрый. Я просто хотел спросить, почему lda не является функцией. Теперь я вижу, в чем на самом деле была моя ошибка. Еще раз, спасибо. Это очень помогает! - person math; 04.08.2013
comment
+1, чтобы показать признательность за расширенное обсуждение анализа и сокращения данных. - person Carl Witthoft; 04.08.2013