将个别点改为组合手段/ SE

我在stats.stackexchange中试过这个问题,有人建议我在这里尝试一下,所以在这里:

我已用RAN和VEGAN软件包完成了一些有关树木健康的生态数据的PCA分析。 总共有80棵树(如此,80个地点)分成四个处理类别。 我已经用颜色编码的点绘制了数据 - 根据治疗组的颜色。 我不想在PCA双槽图上绘制单独的网站/树,我想制作一个像盒子一样的图,它有四个“十字”,它们显示每个组的质心和两个PCA维度的SE。 我在论文中看到过这样的人物,但我似乎无法找到用这种方式绘制的R脚本。 有什么建议么? (我想在这里发布一个我正在寻找的示例图片,但是我可以找到的那些图片都是付费的,对不起)。

我猜想另一种方法是只取网站分数并手动找到手段和SE并创建我自己的情节,但如果可能的话,我宁愿为它找到一个脚本。

我一直在运行的代码非常简单:

p1<-princomp(scale(health, scale=T))
summary(p1)
scores(p1)
plot(p1)
loadings(p1)
biplot(p1, xlab = "PC 1 (38%)", ylab = "PC 2 (22%)",cex=0.6)
plot(p1$scores[,1],p1$scores[,2])
names(p1)

plot(p1$scores[,1],p1$scores[,2], type='n', xlab="PC I", ylab="PC II")
text(p1$scores[,1],p1$scores[,2] labels=Can$tree)

我可能会从ordiellipse开始,看看是否适合您的需求。

### Reproducible example
require("vegan")
data(varespec)
data(varechem)

pca <- rda(varespec, scale = TRUE)
grp <- with(varechem, cut(Baresoil, 4, labels = 1:4))
cols <- c("red","orange","blue","forestgreen")
scl <- 1 ## scaling

plot(pca, display = "sites", scaling = scl, type = "n")
points(pca, display = "sites", scaling = scl, col = cols[grp], pch = 16)
lev <- levels(grp)
for (i in seq_along(lev)) { ## draw ellipse per group
  ordiellipse(pca, display = "sites", kind = "se", scaling = scl,
              groups = grp, col = cols[i], show.groups = lev[i])
}
## centroids
scrs <- as.data.frame(scores(pca, display = "sites", scaling = scl, 
                             choices = 1:2))
cent <- do.call(rbind, lapply(split(scrs, grp), colMeans))
points(cent, col = cols, pch = 3, cex = 1.1)

这产生

在这里输入图像描述

你可以从上面的代码中删除points()行来停止绘制实际的样本,但是我认为这对于理解ordiellipse在做什么而言很有指导意义。

在图中,通过对grp进行分组,将质心标记为每个轴上的网站得分的平均值。 椭圆是一个连续的区域(给定我在ordiellipse()调用中选择的设置)1关于该质心的标准错误。 您对每个方向的误差线的建议是椭圆由ordiellipse绘制的特定情况---如果您要计算质心的标准误差,则它们应该延伸至椭圆的水平和垂直极值点方向。

但是,这不会考虑两个坐标轴上的分数的协方差。 请注意,在下面的示例中,在那些与轴线成角度的椭圆中,标准误差线在椭圆的极值点上不会相交。 如果您要绘制一个包含由误差线定义的区域的框,它将包含椭圆,但它给出质心不确定性的非常不同的印象。

serrFun <- function(df) {
  apply(df, 2, function(x) sd(x) / sqrt(length(x)))
}
serr <- do.call(rbind, lapply(split(scrs, grp), serrFun))
for (i in seq_along(lev)) {
    arrows(cent[i, 1] - serr[i, 1], cent[i, 2],
           cent[i, 1] + serr[i, 1], cent[i, 2],
           col = cols[i], code = 3, angle = 90, length = 0.05)
    arrows(cent[i, 1], cent[i, 2] - serr[i, 2],
           cent[i, 1], cent[i, 2] + serr[i, 2], 
           col = cols[i], code = 3, angle = 90, length = 0.05)
}

在这里输入图像描述

链接地址: http://www.djcxy.com/p/30889.html

上一篇: changing individual points to group means/SE

下一篇: R: Plot works, but ggplot doesn't