【问题标题】:Discriminant Analysis (FDA and MDA) plots in RR中的判别分析(FDA和MDA)图
【发布时间】:2022-04-28 14:50:23
【问题描述】:

我正在尝试使用 mdaggplot2 包绘制灵活判别分析 (FDA) 和混合判别分析 (MDA) 的结果。我为线性判别分析(LDA)做了它,但我不知道继续。任何帮助或想法如何使用 ggplot2 对这些图进行编码?

代码:

require(MASS)
require(ggplot2)
require(mda)
require(scales)
  
irislda <- lda(Species ~ ., iris)

prop.lda = irislda$svd^2/sum(irislda$svd^2)
plda <- predict(irislda,   iris)

dataset = data.frame(species = iris[,"Species"], irislda = plda$x)
p1 <- ggplot(dataset) + geom_point(aes(irislda.LD1, irislda.LD2, colour = species, shape = species), size = 2.5) + 
  labs(x = paste("LD1 (", percent(prop.lda[1]), ")", sep=""),
       y = paste("LD2 (", percent(prop.lda[2]), ")", sep=""))
p1 

irisfda <- fda(Species ~ ., data = iris, method = mars)
 
irismda <- mda(Species ~ ., data = iris)

【问题讨论】:

  • OP,您能说明一下我们可以如何帮助您吗?您的问题与编码或统计有关吗?如果您有与 MDA 相关的统计问题,也许您的问题更适合统计或基于数学的社区?如果您的问题与让代码正常工作有关,那么请务必在此处澄清问题。
  • 谢谢,已更改。我的问题是如何使用 ggplot2 将其编码为图形。

标签: r ggplot2


【解决方案1】:

我相信这会达到您的目标。 fda 模型只有两个维度,所以它是 100% 解释的。 mda 模型有 5 个维度,所以我只展示解释最多的两个。

library(dplyr)
irisfda <- fda(Species ~ ., data = iris, method = mars)

irisfda$fit$fitted.values %>% 
  as_tibble() %>% 
  bind_cols(species = iris[,"Species"]) %>%
  ggplot() +
  geom_point(aes(V1, V2, color = species, shape = species), size = 2.5) + 
  labs(x = paste("FDA1 (", percent(irisfda$percent.explained[1]/100), ")", sep=""),
       y = paste("FDA2 (", percent(irisfda$percent.explained[2]/100 - irisfda$percent.explained[1]/100), ")", sep=""))

irismda <- mda(Species ~ ., data = iris)

irismda$fit$fitted.values %>% 
  as_tibble() %>% 
  bind_cols(species = iris[,"Species"]) %>% 
  ggplot() +
  geom_point(aes(V1, V2, color = species, shape = species), size = 2.5) + 
  labs(x = paste("MDA1 (", percent(irismda$percent.explained[1]/100), ")", sep=""),
       y = paste("MDA2 (", percent(irismda$percent.explained[2]/100 - irismda$percent.explained[1]/100), ")", sep=""))

编辑:

为了消除您看到的警告,我们可以在将矩阵传递给as_tibble 之前命名矩阵的列。此编辑不使用%&gt;% 运算符。

colnames(irisfda$fit$fitted.values) <- c("V1", "V2")
df1 <- bind_cols(as_tibble(irisfda$fit$fitted.values),
                 species = iris[,"Species"])
ggplot(df1) +
  geom_point(aes(V1, V2, color = species, shape = species), size = 2.5) + 
  labs(x = paste("FDA1 (", percent(irisfda$percent.explained[1]/100), ")", sep=""),
       y = paste("FDA2 (", percent(irisfda$percent.explained[2]/100 - irisfda$percent.explained[1]/100), ")", sep=""))


colnames(irismda$fit$fitted.values) <- c("V1", "V2", "V3", "V4", "V5", "V6", "V7", "V8") 
df2 <- bind_cols(as_tibble(irismda$fit$fitted.values), 
                 species = iris[,"Species"])
ggplot(df2) +
  geom_point(aes(V1, V2, color = species, shape = species), size = 2.5) + 
  labs(x = paste("MDA1 (", percent(irismda$percent.explained[1]/100), ")", sep=""),
       y = paste("MDA2 (", percent(irismda$percent.explained[2]/100 - irismda$percent.explained[1]/100), ")", sep=""))

编辑 2: 看来您不想使用dplyr,所以我在此处将基本 R 函数与ggplot 绘图一起包括在内。

library(dplyr)
require(MASS)
require(ggplot2)
require(mda)
require(scales)
irisfda <- fda(Species ~ ., data = iris, method = mars)

irismda <- mda(Species ~ ., data = iris)

df1 <- cbind(data.frame(irisfda$fit$fitted.values),
                 species = iris[,"Species"])
ggplot(df1) +
  geom_point(aes(X1, X2, color = species, shape = species), size = 2.5) + 
  labs(x = paste("FDA1 (", percent(irisfda$percent.explained[1]/100), ")", sep=""),
       y = paste("FDA2 (", percent(irisfda$percent.explained[2]/100 - irisfda$percent.explained[1]/100), ")", sep=""))


df2 <- cbind(data.frame(irismda$fit$fitted.values), 
                 species = iris[,"Species"])
ggplot(df2) +
  geom_point(aes(X1, X2, color = species, shape = species), size = 2.5) + 
  labs(x = paste("MDA1 (", percent(irismda$percent.explained[1]/100), ")", sep=""),
       y = paste("MDA2 (", percent(irismda$percent.explained[2]/100 - irismda$percent.explained[1]/100), ")", sep=""))

【讨论】:

  • 非常感谢。是否可以提供没有%&gt;% 的版本。这将帮助我更好地理解它。有一个与 tidyverse 包相关的警告:如果在 tibble 2.0.0 中省略了 .name_repairas_tibble.matrix()Warning message: The x` 参数必须具有列名。使用兼容性.name_repair。此警告每 8 小时显示一次。致电lifecycle::last_warnings() 以查看生成此警告的位置。
  • 我已经编辑了答案以解决您提出的两件事。
  • 酷。您是否还可以仅使用没有 tibble 和 %>% 的数据框添加解决方案
  • @JohnSal 我编辑为只使用基本函数(即没有 tibble 和没有 %>%)。
猜你喜欢
  • 1970-01-01
  • 2014-01-19
  • 2013-12-10
  • 2011-08-03
  • 1970-01-01
  • 2013-09-26
  • 2015-01-01
  • 1970-01-01
  • 2015-08-17
相关资源
最近更新 更多