难以理解 veganCovEllipse 协方差椭圆计算
Trouble understanding veganCovEllipse covariance ellipse calculation
我无法理解 vegan 包 v 2.5-7 中的 veganCovEllipse() 函数如何计算椭圆。
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)))
}
具体来说,函数的最后一行发生了什么。此函数基于协方差矩阵计算椭圆,但我不确定计算的是哪种类型的椭圆。这会是一个错误椭圆吗?如果是这样,比例参数代表什么?
这是从 PCA 分数创建椭圆的示例:
library(stats)
# fit pca on mtcars dataset
mtcars_pca <- prcomp(mtcars[,c(1:7,10,11)], center = TRUE,scale. = TRUE)
# dataframe of pc1 and pc2 scores
pcs <- data.frame(PC1 = mtcars_pca$x[,1],
PC2 = mtcars_pca$x[,2])
# calculate weighted covariance of PC1 and PC2
weight_cov <- cov.wt(cbind(pcs$PC1, pcs$PC2), wt=rep(1/length(pcs$PC1), length(pcs$PC1)))$cov
# calculate mean of PC1 and PC2, used as the center of the ellipse
center <- c(mean(pcs$PC1),
mean(pcs$PC2))
# fit ellipse given weighted covariance and center
ellipse <- veganCovEllipse(weight_cov, center)
veganCovEllipse
不是导出函数。这意味着它不适合交互使用,但它是一个支持函数,只能从 vegan 中的其他函数调用。因此没有记录。然而,答案很简单:它可以根据输入计算 any 种椭圆。在 vegan 中,例如从 ordiellipse
调用该函数,它可以绘制标准误差椭圆、“置信度”椭圆(标准误差乘以从统计分布中选取的某个值)、标准差椭圆、标准差椭圆乘以类似的常量作为标准误差,或包含一组所有点的封闭椭圆,具体取决于函数的输入。在 showvarparts
函数中只是 re-used 画圆。实际上 veganCovEllipse
不适合任何东西:它只是计算坐标来绘制你要求它绘制的内容,你的输入定义了椭圆坐标的形状、大小、方向和位置。
其他包中的其他函数也执行相同的操作:return 您需要根据输入数据绘制椭圆的点。例如,标准(推荐)包集群在 non-exported 函数 cluster:::ellipsoidPoints
中使用有效相同的数学进行类似计算,但方式完全不同。此函数也是 non-exported,旨在从用户函数 cluster::predict.ellipsoid
中调用。 vegan 实现类似于 car 包中的 ellipse
函数,其中这些计算嵌入在该函数中,不能与 car::ellipse
.
分开调用
我无法理解 vegan 包 v 2.5-7 中的 veganCovEllipse() 函数如何计算椭圆。
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)))
}
具体来说,函数的最后一行发生了什么。此函数基于协方差矩阵计算椭圆,但我不确定计算的是哪种类型的椭圆。这会是一个错误椭圆吗?如果是这样,比例参数代表什么? 这是从 PCA 分数创建椭圆的示例:
library(stats)
# fit pca on mtcars dataset
mtcars_pca <- prcomp(mtcars[,c(1:7,10,11)], center = TRUE,scale. = TRUE)
# dataframe of pc1 and pc2 scores
pcs <- data.frame(PC1 = mtcars_pca$x[,1],
PC2 = mtcars_pca$x[,2])
# calculate weighted covariance of PC1 and PC2
weight_cov <- cov.wt(cbind(pcs$PC1, pcs$PC2), wt=rep(1/length(pcs$PC1), length(pcs$PC1)))$cov
# calculate mean of PC1 and PC2, used as the center of the ellipse
center <- c(mean(pcs$PC1),
mean(pcs$PC2))
# fit ellipse given weighted covariance and center
ellipse <- veganCovEllipse(weight_cov, center)
veganCovEllipse
不是导出函数。这意味着它不适合交互使用,但它是一个支持函数,只能从 vegan 中的其他函数调用。因此没有记录。然而,答案很简单:它可以根据输入计算 any 种椭圆。在 vegan 中,例如从 ordiellipse
调用该函数,它可以绘制标准误差椭圆、“置信度”椭圆(标准误差乘以从统计分布中选取的某个值)、标准差椭圆、标准差椭圆乘以类似的常量作为标准误差,或包含一组所有点的封闭椭圆,具体取决于函数的输入。在 showvarparts
函数中只是 re-used 画圆。实际上 veganCovEllipse
不适合任何东西:它只是计算坐标来绘制你要求它绘制的内容,你的输入定义了椭圆坐标的形状、大小、方向和位置。
其他包中的其他函数也执行相同的操作:return 您需要根据输入数据绘制椭圆的点。例如,标准(推荐)包集群在 non-exported 函数 cluster:::ellipsoidPoints
中使用有效相同的数学进行类似计算,但方式完全不同。此函数也是 non-exported,旨在从用户函数 cluster::predict.ellipsoid
中调用。 vegan 实现类似于 car 包中的 ellipse
函数,其中这些计算嵌入在该函数中,不能与 car::ellipse
.