2
library(MASS)
example(lda)
plot(z)

如何访问 z 中的所有点?我想知道 LD1 和 LD2 上每个点的值取决于它们的 Sp (c,s,v)。

4

3 回答 3

5

您要查找的内容是作为predict()类对象方法的一部分计算的"lda"(请参阅 参考资料?predict.lda)。它作为x生成的对象的组件返回predict(z)

## follow example from ?lda
Iris <- data.frame(rbind(iris3[,,1], iris3[,,2], iris3[,,3]),
                   Sp = rep(c("s","c","v"), rep(50,3)))
set.seed(1) ## remove this line if you want it to be pseudo random
train <- sample(1:150, 75)
table(Iris$Sp[train])
## your answer may differ
##  c  s  v
## 22 23 30
z <- lda(Sp ~ ., Iris, prior = c(1,1,1)/3, subset = train)

## get the whole prediction object
pred <- predict(z)
## show first few sample scores on LDs
head(z$x)

最后一行显示了线性判别式上对象分数的前几行

> head(pred$x)
          LD1        LD2
40  -8.334664  0.1348578
56   2.462821 -1.5758927
85   2.998319 -0.6648073
134  4.030165 -1.4724530
30  -7.511226 -0.6519301
131  6.779570 -0.8675742

这些分数可以像这样绘制

plot(LD2 ~ LD1, data = pred$x)

产生以下图(对于这个训练样本!)

LDA分数图

于 2012-09-19T14:33:10.027 回答
1

当你调用函数plot(z)时,你实际上是在调用函数plot.lda——这是一个 S3 方法。基本上,该对象z具有类lda

class(z)

我们可以查看正在使用的实际功能:

getS3method("plot", "lda")

事实证明这是相当复杂的。但关键点是:

x = z
Terms <- x$terms
data <- model.frame(x)
X <- model.matrix(delete.response(Terms), data)
g <- model.response(data)
xint <- match("(Intercept)", colnames(X), nomatch = 0L)
X <- X[, -xint, drop = FALSE]
means <- colMeans(x$means)
X <- scale(X, center = means, scale = FALSE) %*% x$scaling

我们不能像以前那样绘制:

plot(X[,1], X[,2])

附带条件 很可能有一种更简单的方法可以得到你想要的东西——我只是不知道这个lda功能。

于 2012-09-19T13:52:19.610 回答
0

GavinSimpson的好例子的更多细节

## follow example from ?lda
Iris <- data.frame(rbind(iris3[,,1], iris3[,,2], iris3[,,3]),
                   Sp = rep(c("s","c","v"), rep(50,3)))
set.seed(1)
train <- sample(1:150, 75)
z <- lda(Iris[train,-5], grouping = Iris[train,5], prior = c(1,1,1)/3)

## get the whole prediction object
pred <- predict(z)

如果您想了解 的魔力predict.lda,可以通过以下方法手动计算(预测)LD 分数矩阵:您所要做的就是使用中心向量将原始数据(或同类新数据)居中(LDA 使用组均值的平均值)原始数据colMeans(z$means),并将每个居中的观测值乘以存储在 中的 LD 载荷(线性系数)z$scaling

手动预测

pred.self <- scale(Iris[train,-5], center = colMeans(z$means), scale = FALSE) %*% z$scaling

验证使用predict.lda()

> all.equal(pred$x, pred.self) # it's the same!
[1] TRUE

验证使用plot.lda()

plot(z, dimen = 2)
points(pred.self, col = "blue") # corresponds to plot.lda() output

图像输出

仔细看看predict.lda函数

getAnywhere(predict.lda)

揭示了由于输入数据和 LD 分数都没有存储在lda对象中,因此该predict.lda函数必须在 R 环境中查找输入数据。

newdata <- eval.parent(z$call$x)
all.equal(newdata, Iris[train,-5]) # it's the same!
于 2021-09-10T23:25:48.710 回答