簡體   English   中英

R 中的典型相關分析

[英]Canonical Correlation Analysis in R

我正在使用 R(和 package CCA)並嘗試使用兩個變量集(物種豐度和食物豐度分別存儲為兩個矩陣 Y 和 X)執行正則化典型相關分析,其中單位數(N = 15)小於矩陣中的變量數,大於 400(其中大多數是潛在的“解釋”變量,只有 12-13 個“響應”變量)。 岡薩雷斯等人。 (2008, http://www.jstatsoft.org/v23/i12/paper )請注意,package“包括CCA的正則化版本,用於處理變量多於單位的數據集”,這當然是我所擁有的15 個“單位”。 因此,我正在嘗試使用 CCA package 執行正則化典型相關分析,以查看我的變量集中的關系。 我一直在關注 Gonzalez et al (2008) go 在他們的論文中的過程。 但是,我收到一條錯誤消息Error in chol.default(Bmat): the leading minor of order 12 is not positive definite ,我不知道它是什么意思或如何處理它。 這是代碼,任何關於該主題的想法或知識將不勝感激。

library(CCA)
correl <- matcor(X, Y)
img.matcor(correl, type = 2)
res.regul <- estim.regul(X, Y, plt = TRUE,
    grid1 = seq(0.0001, 0.2, l=51),
    grid2 = seq(0, 0.2, l=51))

Error in chol.default(Bmat) : the leading minor of order 12 is not positive definite

(注意:當您使用來自 CCA 的樣本數據 nutrimouse 時, estim.regul()需要很長時間(約 30-40 分鍾)才能完成)。

有什么建議嗎? 有誰知道如何處理這個錯誤? 是因為我的一些專欄中有 NA 嗎? 可能是因為列中的 0 太多? 提前感謝您可以為這個組合統計數據和 R 新手提供的任何幫助。

背景

典型相關分析 (CCA) 是一種探索性數據分析 (EDA) 技術,可估計在同一實驗單元上收集的兩組變量之間的相關關系。 通常,用戶將有兩個數據矩陣 X 和 Y,其中行代表實驗單位,nrow(X) == nrow(Y)。

在 R 中,基礎 package 提供了 function cancor() 來啟用 CCA。 這僅限於觀察數量大於變量(特征)數量的情況,nrow(X) > ncol(X)。

R package CCA 是提供擴展 CCA 功能的幾個之一。 Package CCA 圍繞 cancor() 提供了一組包裝函數,可以考慮特征計數超過實驗單元計數的情況,ncol(X) > nrow(X)。 Gonzalez et al (2008) CCA: An R Package to Extend Canonical Correlation Analysis ,詳細描述了工作原理。 package CCA (發布於 2014-07-02)的 1.2 版在撰寫本文時是最新的。

可能還值得一提的是,先前答案中提到的包kinshipaccuracy不再托管在 CRAN 上。

診斷

在跳轉到其他包或對您的(可能是來之不易的)數據應用未知方法之前。 可以說嘗試診斷數據問題可能是有益的。

傳遞給此處提到的任何 CCA 例程的矩陣在理想情況下應該是數字完整的(沒有缺失值)。 傳遞給此處提到的任何 CCA 例程的矩陣在理想情況下應該是數字完整的(沒有缺失值)。 該過程估計的規范相關數將等於 X 和 Y 的最小列秩,即 <= min(ncol(X), ncol(Y))。 理想情況下,每個矩陣的列將是線性獨立的(不是其他矩陣的線性組合)。

例子:

library(CCA)
data(nutrimouse)
X <- as.matrix(nutrimouse$gene[,1:10])
Y <- as.matrix(nutrimouse$lipid)

cc(X,Y) ## works

X[,1] <- 2 * X[,9] ## column 9 no longer provides unique information

cc(X,Y)

Error in chol.default(Bmat) :
  the leading minor of order 9 is not positive definite

這是原帖中看到的症狀。 一個簡單的測試是嘗試在沒有該列的情況下進行擬合

cc(X[,-9],Y) ## works

因此,雖然從分析中刪除數據的意義上這可能令人沮喪,但該數據無論如何都不能提供信息。 您的分析只能與您提供的數據一樣好。

此外,有時可以通過對一個(或兩個)輸入矩陣使用標准化(參見?scale )變量來解決數值不穩定性:

X <- scale(X)

當我們在這里時,也許值得指出的是,正則化 CCA 本質上是一個兩步過程。 進行交叉驗證以估計正則化參數(使用estim.regul() ),然后使用這些參數執行正則化 CCA(使用rcc() )。

論文中提供的示例(原始帖子中逐字使用的參數)

res.regul <- estim.regul(X, Y, plt = TRUE,
                               grid1 = seq(0.0001, 0.2, l=51),
                               grid2 = seq(0, 0.2, l=51))

要求在 51*51 = 2601 單元格網格上進行交叉驗證。 雖然這為論文生成了一個漂亮的圖形,但對於您自己的數據的初始測試,這些設置並不明智。 正如作者 state 所說,“計算要求不是很高。在 51 x 51 網格的‘當前使用’計算機上持續了不到一個半小時”。 自 2008 年以來,情況有所改善,但默認的 5 x 5 網格由

estim.regul(X,Y,plt=TRUE) 

是探索目的的絕佳選擇。 如果你要犯錯誤,你最好盡快犯錯。

您的 X 方差-協方差矩陣不是正定的,因此在內部調用fda::geigen時會出錯。

There's a similar function for regularized CCA in the mixOmics package, but I guess it will lead to the same error message because it basically uses the same approach (except that they plugged the geigen function directly into the rcc function). 對於一個相關的問題,我實際上不記得我是如何讓它與我的數據一起工作的(但是一旦我再次找到它,我會查看我的舊代碼:-)

一種解決方案是使用廣義 Cholesky 分解。 有一個親屬關系gchol ;小心,它返回一個下三角矩陣)或精度sechol )package。 當然,這意味着修改 function 內部的代碼,但這不是問題,IMO。 或者您可以嘗試使用make.positive.definite中的make.positive.defined來制作 Var(X) PD。

作為替代方案,您可以考慮使用RGCCA package,它為帶有 k 塊的 PLS(路徑建模)和 CCA 方法提供統一的接口。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM