【发布时间】:2015-08-17 15:14:09
【问题描述】:
我使用线性判别分析 (LDA) 来研究一组变量在 3 个组之间的区分程度。然后,我使用plot.lda() 函数将我的数据绘制在两个线性判别式(x 轴上的 LD1 和 y 轴上的 LD2)上。我现在想将 LDA 的分类边界添加到绘图中。我在函数中看不到允许这样做的参数。 partimat() 函数允许可视化 LD 分类边界,但在这种情况下,变量用作 x 和 y 轴,而不是线性判别式。任何有关如何向plot.lda 添加分类边界的建议将不胜感激。下面是一些示例代码:
library(MASS)
# LDA
t.lda = lda(Group ~ Var1 + Var2, data=mydata,
na.action="na.omit", CV=TRUE)
# Scatter plot using the two discriminant dimensions
plot(t.lda,
panel = function(x, y, ...) { points(x, y, ...) },
col = c(4,2,3)[factor(mydata$Group)],
pch = c(17,19,15)[factor(mydata$Group)],
ylim=c(-3,3), xlim=c(-5,5))
以下是一些示例数据(3 个组,2 个变量):
> dput(mydata)
structure(list(Group = c("a", "a", "a", "a", "a", "a", "a", "a",
"b", "b", "b", "b", "b", "b", "b", "b", "c", "c", "c", "c", "c",
"c", "c", "c"), Var1 = c(7.5, 6.9, 6.5, 7.3, 8.1, 8, 7.4, 7.8,
8.3, 8.7, 8.9, 9.3, 8.5, 9.6, 9.8, 9.7, 11.2, 10.9, 11.5, 12,
11, 11.6, 11.7, 11.3), Var2 = c(-6.5, -6.2, -6.7, -6.9, -7.1,
-8, -6.5, -6.3, -9.3, -9.5, -9.6, -9.1, -8.9, -8.7, -9.9, -10,
-6.7, -6.4, -6.8, -6.1, -7.1, -8, -6.9, -6.6)), .Names = c("Group",
"Var1", "Var2"), class = "data.frame", row.names = c(NA, -24L
))
> head(mydata)
Group Var1 Var2
1 a 7.5 -6.5
2 a 6.9 -6.2
3 a 6.5 -6.7
4 a 7.3 -6.9
5 a 8.1 -7.1
6 a 8.0 -8.0
编辑:根据 Roman 的回答,我尝试更改代码以在线性判别尺度上绘制分类边界(这是我想要实现的),而不是在原始变量的尺度上。但是,边界并不位于应有的位置。任何关于我在这里做错的建议将不胜感激:
#create new data
np = 300
nd.x = seq(from = min(mydata$Var1), to = max(mydata$Var1), length.out = np)
nd.y = seq(from = min(mydata$Var2), to = max(mydata$Var2), length.out = np)
nd = expand.grid(Var1 = nd.x, Var2 = nd.y)
#run lda and predict using new data
new.lda = lda(Group ~ Var1 + Var2, data=mydata)
prd = as.numeric(predict(new.lda, newdata = nd)$class)
#create LD sequences from min - max values
p = predict(new.lda, newdata= nd)
p.x = seq(from = min(p$x[,1]), to = max(p$x[,1]), length.out = np) #LD1 scores
p.y = seq(from = min(p$x[,2]), to = max(p$x[,2]), length.out = np) #LD2 scores
#create original plot
quartz()
plot(t.lda, panel = function(x, y, ...) { points(x, y, ...) },
col = c(4,2,3)[factor(mydata$Group)],
pch = c(17,19,15)[factor(mydata$Group)],
ylim=c(-3,3), xlim=c(-5,5))
#add classification border on scale of linear discriminants (NOTE: this step currently doesn't work)
contour(x = p.x, y = p.y, z = matrix(prd, nrow = np, ncol = np),
levels = c(1, 2, 3), add = TRUE, drawlabels = FALSE)
【问题讨论】:
-
您也可以查看 [这里][1] 的 ggplot2 解决方案。 [1]:stackoverflow.com/questions/24260576/…
标签: r plot classification lda