我正在尝试做一些与旧帖子类似的事情:plotting - original post
对于我的分析,我感兴趣的是不同的哺乳动物宿主是否有不同的跳蚤社区。我链接到的原始帖子有两个不同的省略号解决方案。我的问题是,当我同时运行第一个解决方案,然后是一般解决方案时,我看到的情节大不相同,而我认为它们应该非常相似。以下是我的代码。
我的问题是:我做错了什么或者哪些代码生成了正确的数字?或者是否有一个更好的新代码,我应该使用它来显示宿主物种在跳蚤社区中的差异?
谢谢, 阿曼达
library(vegan)
library(BiodiversityR)
library(MASS)
comm_mat <- read.csv("d:/fleaID/ARG_comm.csv",header=TRUE)
env <- read.csv("d:/fleaID/ARG_env.csv",header=TRUE)
library(ggplot2)
sol <-metaMDS(comm_mat)
MyMeta=env
#originalresponse
NMDS = data.frame(MDS1 = sol$points[,1], MDS2=sol$points[,2],group=MyMeta$host)
NMDS.mean=aggregate(NMDS[,1:2],list(group=NMDS$group),mean)
veganCovEllipse<-function (cov, center = c(0, 0), scale = 1, npoints = 100)
{
theta <- (0:npoints) * 2 * pi/npoints
Circle <- cbind(cos(theta), sin(theta))
t(center + scale * t(Circle %*% chol(cov)))
}
df_ell <- data.frame()
for(g in levels(NMDS$group)){
df_ell <- rbind(df_ell, cbind(as.data.frame(with(NMDS[NMDS$group==g,],
veganCovEllipse(cov.wt(cbind(MDS1,MDS2),wt=rep(1/length(MDS1),length(MDS1)))$cov,center=c(mean(MDS1),mean(MDS2)))))
,group=g))
}
ggplot(data = NMDS, aes(MDS1, MDS2)) + geom_point(aes(color = group)) +
geom_path(data=df_ell, aes(x=MDS1, y=MDS2,colour=group), size=1, linetype=2)+
annotate("text",x=NMDS.mean$MDS1,y=NMDS.mean$MDS2,label=NMDS.mean$group)
#update - can use se (standard error) or sd (standard dev)
#update
NMDS = data.frame(MDS1 = sol$points[,1], MDS2 = sol$points[,2],group=MyMeta$host)
plot.new()
ord<-ordiellipse(sol, MyMeta$host, display = "sites",
kind = "se", conf = 0.95, label = T)
df_ell <- data.frame()
for(g in levels(NMDS$group)){
df_ell <- rbind(df_ell, cbind(as.data.frame(with(NMDS[NMDS$group==g,],
veganCovEllipse(ord[[g]]$cov,ord[[g]]$center,ord[[g]]$scale)))
,group=g))
}
ggplot(data = NMDS, aes(MDS1, MDS2)) + geom_point(aes(color = group)) +
geom_path(data=df_ell, aes(x=NMDS1, y=NMDS2,colour=group), size=1, linetype=2)
答案 0 :(得分:2)
第一种和第二种绘图方法有两个主要区别。
第一种方法是使用标准偏差计算椭圆路径,不进行缩放。第二种方法是使用标准错误,也是缩放数据。因此,使用第一种方法生成的图也可以通过对ordiellipse
函数(kind='sd'
,而不是'se'
)进行必要的更改,并删除比例(第二种方法)来实现(来自ord[[g]]$scale
函数的veganCovEllipse
)。我在下面列出了这个,所以你可以亲自看看。
最终,两个情节都是正确的,这取决于你想要展示的内容。只要您指定使用标准误差或偏差,就可以使用任何一种。至于是否扩展,这实际上取决于您的数据。此链接可能会有所帮助:Understanding `scale` in R。
第一种方法:
sol <-metaMDS(comm_mat)
MyMeta=env
#originalresponse
NMDS = data.frame(MDS1 = sol$points[,1], MDS2=sol$points[,2],group=MyMeta$host)
NMDS.mean=aggregate(NMDS[,1:2],list(group=NMDS$group),mean)
veganCovEllipse<-function (cov, center = c(0, 0), scale = 1, npoints = 100)
{
theta <- (0:npoints) * 2 * pi/npoints
Circle <- cbind(cos(theta), sin(theta))
t(center + scale * t(Circle %*% chol(cov)))
}
df_ell <- data.frame()
for(g in levels(NMDS$group)){
df_ell <- rbind(df_ell, cbind(as.data.frame(with(NMDS[NMDS$group==g,],
veganCovEllipse(cov.wt(cbind(MDS1,MDS2),wt=rep(1/length(MDS1),length(MDS1)))$cov,center=c(mean(MDS1),mean(MDS2)))))
,group=g))
}
ggplot(data = NMDS, aes(MDS1, MDS2)) + geom_point(aes(color = group)) +
geom_path(data=df_ell, aes(x=MDS1, y=MDS2,colour=group), size=1, linetype=2)+
annotate("text",x=NMDS.mean$MDS1,y=NMDS.mean$MDS2,label=NMDS.mean$group)
给出:
第二种方法:
plot.new()
ord<-ordiellipse(sol, MyMeta$host, display = "sites",
kind = "sd", conf = .95, label = T)
df_ell <- data.frame()
for(g in levels(NMDS$group)){
df_ell <- rbind(df_ell, cbind(as.data.frame(with(NMDS[NMDS$group==g,],
veganCovEllipse(ord[[g]]$cov,ord[[g]]$center)))
,group=g))
}
plot2<-ggplot(data = NMDS, aes(MDS1, MDS2)) + geom_point(aes(color = group)) +
geom_path(data=df_ell, aes(x=NMDS1, y=NMDS2,colour=group), size=1, linetype=2)+
annotate("text",x=NMDS.mean$MDS1,y=NMDS.mean$MDS2,label=NMDS.mean$group)
plot2
同时给出: