【问题标题】:3D PCA plotting error: the leading minor of order 3 is not positive definite3D PCA 绘图错误:3 阶的主要次要不是正定的
【发布时间】:2018-11-26 22:05:37
【问题描述】:

在过去的几个小时里,我一直在尝试解决一个问题,但没有成功。

我在另一篇类似的帖子中发现了一条错误消息:Plotting Ellipse3d in R Plotly with surface ellipse

唯一的回应强调这是因为缺乏样本。但我的样本量 = 3;这是创建椭圆的最小值。

另一个帖子的另一个回复强调,这可能是因为输入到 ellipse3d() 中的矩阵不是对称方阵,但实际上是因为我在输入时取了 cov(data_frame_of_interest)。

关于问题的更多信息:

我正在尝试使用 R 和 prcomp() 中的 rgl 包绘制 3d PCA;其中 top_noSR3 是一个 prcomp() 对象。我对以下示例的前 3 台 PC 感兴趣。

#Here is the exact PCA object obtained from prcomp(). It is 
#top_noSR3$x[,c(1,2,3)].    

top_noSR3 <- list(x = structure(c(-1.51867921165966, 4.7156146538954, -0.812795773332441, 
-2.38413966890339, -2.57305046487183, 8.4906222835565, 1.66680581870767, 
-7.5843776373923, 3.35199279752431, 2.4452307290032, -7.33666903970592, 
1.53944551317846, -1.72127982564219, 2.68563509110228, -2.75720515666432, 
1.79284989120424, -0.962414945057766, -1.44498205066367, -0.270435252418625, 
2.67783224814005, -0.780985238414212, 7.3028581587737, -1.3641698814598, 
-5.15770303889969, 0.989625278145346, 0.101301456051966, 1.96037141973899, 
-3.05129815393625, -2.29377625653868, -4.3601221831666, 5.9554046825257, 
0.698493757179566, 2.3724852157055, 0.0505080025883657, -1.97013906903266, 
-0.452854149261224), .Dim = c(12L, 3L), .Dimnames = list(c("SR1.4", 
"SR1.5", "SR1.6", "SR1.7", "SR2.2", "SR2.3", "SR2.4", "SR2.5", 
"CI1.4", "CI1.5", "CI1.6", "CI1.7"), c("PC1", "PC2", "PC3"))))

#col_object is an array of colours used for colouring the points in the PCA:
col_object <- c("blue","red","green","purple","blue","red",   
"green","purple","blue","red","green","purple")

plot3d(top_noSR3$x[,c(1,2,3)], type = "s", size = 1, col = col_object)

#Divide object into 3 components for 3d ellipse plotting function

for_plot3d <- function(casetime){

  return(top_noSR3$x[casetime, c(1,2,3)])
}

BASE <- c("SR1.4", "SR2.2", "CI1.4")
EA <- c("SR1.5", "SR2.3", "CI1.5")
LA <- c("SR1.6", "SR2.4", "CI1.6")
FU <- c("SR1.7", "SR2.5", "CI1.7")

BASE_for3d <- for_plot3d(BASE)
EA_for3d <- for_plot3d(EA)
LA_for3d <- for_plot3d(LA)
FU_for3d <- for_plot3d(FU)

#The following arguments used above (BASE,EA, etc.) ^ are 
#timepoints/rownames of interest. length(BASE) = ... = length(FU) = 3


center4plot <- function(x){
  k <- mean(x[,1])
  h <- mean(x[,2])
  z <- mean(x[,3])
  return(c(k,h,z))
}

center_base <- center4plot(BASE_for3d)
center_EA <- center4plot(EA_for3d)
center_LA <- center4plot(LA_for3d)
center_FU <- center4plot(FU_for3d)

ellipse_base <- ellipse3d(cov(BASE_for3d),level = 0.95, centre=center_base)
ellipse_EA <- ellipse3d(cov(EA_for3d), level = 0.95, centre=center_EA)

#ERROR appears here, in ellipse_LA
ellipse_LA <- ellipse3d(cov(LA_for3d), level = 0.95, centre=center_LA)
ellipse_FU <- ellipse3d(cov(FU_for3d), level = 0.95, centre=center_FU)

当我使用 ellipse_LA 运行该行时,我收到以下消息: ellipse3d() chol.default(cov) 中的错误:3 阶的前导次要不是正定的

感谢大家的时间和精力。

【问题讨论】:

  • 非退化椭圆需要 3 个点,但 3-D 椭圆体需要 4 个点。我怀疑您根本不需要进行分解,但是由于您尚未发布可重现的示例,因此我不确定。
  • 所有其他椭圆都只需要 3 个点...
  • 你想看什么样的例子
  • 只需发布足够的代码和数据,我们就可以通过运行您的代码来重现问题。我认为在这种情况下,这意味着我们需要查看top_noSR3col_object(使用dput(top_noSR3)dput(col_object)),但可能还缺少其他内容。如果这些内容太大或太机密而无法发布,请发布仍能说明您的问题的较小的虚假值。
  • 我刚刚添加了感兴趣的时间点,关于 top_noSR3,刚刚添加了 dput() 对象,我明白你现在在说什么了。

标签: r 3d pca rgl


【解决方案1】:

当我运行当前版本的代码时,我收到了您在此处看到的错误:

> ellipse_base <- ellipse3d(cov(BASE_for3d),level = 0.95, centre=center_base)
Error in chol.default(cov) : 
  the leading minor of order 3 is not positive definite

如果我查看该矩阵的特征值,我发现消息是正确的:

> eigen(cov(BASE_for3d))
eigen() decomposition
$values
[1] 1.454977e+01 1.433775e+00 8.521084e-16

$vectors
           [,1]       [,2]       [,3]
[1,] 0.81230516  0.5213444  0.2614581
[2,] 0.04362183  0.3927276 -0.9186197
[3,] 0.58159906 -0.7576048 -0.2962727

请注意,最小的特征值近似为零。

BASE_for3d 对象中有 3 个点。它们都位于一个平面上(任何 3 个点都必须如此)。因此,它们的协方差矩阵是 2 级,而不是 3 级。您需要增加 BASE 以包括至少 4 行,而不是全部在一个平面中,而不仅仅是 3。例如,

BASE <- c("SR1.4", "SR2.2", "CI1.4", "SR1.5")

这会导致以下结果:

BASE_for3d <- for_plot3d(BASE)
center_base <- center4plot(BASE_for3d)
ellipse_base <- ellipse3d(cov(BASE_for3d),level = 0.95, centre=center_base)
shade3d(ellipse_base, alpha = 0.2)

【讨论】:

  • 这很奇怪......对我来说,它适用于所有 ellipse3d() 调用,但不适用于 LA 调用......我明白你在说什么关于矩阵的等级。问题是,我想在这个 3d 空间中绘制四个 2d 椭圆,到目前为止我只能得到三个。你知道另一个可以让我完成这项工作的功能吗?
  • 另外,关于您的解决方案,我们会在 4 个点而不是 3 个兴趣点周围画一个椭圆,对吗?....感谢您抽出宝贵时间来解释这一点 :)跨度>
  • ellipse3d() 绘制一个椭圆体,即横截面为椭圆的实心图形。在解决方案中,一般会包含选择的 4 个点。
猜你喜欢
  • 2018-12-06
  • 2019-12-21
  • 2021-09-29
  • 2018-03-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-07
相关资源
最近更新 更多