如何在R

时间:2016-04-12 12:14:19

标签: multidimensional-array pca n-way

我想在R中执行三向主成分分析,虽然我已经找到一些文章解释它是如何工作的以及如何解释结果,但我在网上找不到任何有用的指南如何在R中进行。

我的数据包括230个样本,250,000个变量和50个注释。通常人们只使用以下类型的数据上的一个注释来执行标准PCA:

标准数据:

        var1 var2 var3 var4
Sample1  1/1  0/0  1/1  1/0
Sample2  1/0  1/1  1/1  1/0
Sample3  0/0  1/1  1/1  1/1
Sample4  0/0  0/0  1/1  0/0
Sample5  1/0  1/0  0/0  1/1

但是,我想在分析中实现所有注释信息,这样我就可以综合使用所有50个矩阵进行分析。以这种方式,注释的组合可以解释样本之间的更多差异,而不是单个注释单独进行,例如,注释1和4一起解释了注释1单独的更多方差。

注释1:

         var1 var2 var3 var4
Sample1  1/1  0/0  1/1  1/0
Sample2  1/0  1/1  1/1  1/0
Sample3  0/0  1/1  1/1  1/1
Sample4  0/0  0/0  1/1  0/0
Sample5  1/0  1/0  0/0  1/1

注释2:

         var1      var2      var3  var4
Sample1  missense  none      STOP  synonymous
Sample2  missense  missense  STOP  synonymous
Sample3  none      missense  STOP  synonymous
Sample4  none      none      STOP  none
Sample5  missense  missense  none  synonymous

注释3:

         var1  var2   var3  var4
Sample1  0.30   0.00  0.01  0.04
Sample2  0.30  -0.24  0.01  0.04
Sample3  0.00  -0.24  0.01  0.04
Sample4  0.00  -0.24  0.01  0.00
Sample5  0.30  -0.24  0.00  0.04

注释4:

         var1  var2  var3  var4
Sample1  CTCF  NONE  NONE  MAX
Sample2  CTCF  NONE  NONE  MAX
Sample3  NONE  NONE  NONE  MAX
Sample4  NONE  NONE  NONE  NONE
Sample5  CTCF  NONE  NONE  MAX

根据我的发现,有三个包可以做Tucker 3路PCA:ThreeWay,PTAk和rTensor。我试图运行ThreeWay,但他们使用的数据结构似乎非常难以使用。也许我可以做这个工作,但是ThreeWay文章中的例子也产生了一个错误,所以我更喜欢另一个包:

ThreeWay数据结构:

         var1_anno1    var1_anno2    var1_anno3   var2_anno1    var2_anno2
Sample1  1/1           missense      0.30         0/0           missense
Sample2  1/0           missense      0.30         1/1           missense
Sample3  0/0           none          0.30         1/1           missense
Sample4  0/0           none          0.30         0/0           none
Sample5  1/0           missense      0.30         1/0           missense

PTAk套餐要求: “如果使用非标识度量标准,则表示订单k的张量(作为数组)X是一个列表,其中数据作为数组并满足度量列表”

我不清楚这意味着什么。我试着研究如何生成张量的张量包,但是它们的例子非常复杂,因为它们在各种张量上进行了大量的乘法运算,而不是解释如何创建张量形式数据的基础知识。

我很欣赏这种方法的弱点和如何创建张量的评论,以及如何使用任何软件包对它们进行分析。

由于

2 个答案:

答案 0 :(得分:0)

我最终使用 PTAk 包来运行分析。

为了构建张量,我使用了两个包 tensor abind

我通过从矩阵创建向量来构建张量(也称为多向数组) 然后在三个维度上重新定义其尺寸。然后使用函数abind将每个个体的数组合并到最终的三维张量中。

for (i in 1:length(list_of_sample_matrices)) {  

    # Converting matrix into single sample tensor
    single_sample_tensor <- array(as.vector(list_of_sample_matrices[i])), c(250000, 50, 1))

    # Creating all sample tensor
    if (i == 1) {
        all_sample_tensor <- single_sample_tensor
    }

    # Adding a single sample tensor at the time to the all sample tensor
    if (i > 1) {
        all_sample_tensor <- abind(all_sample_tensor, single_sample_tensor)
    }
}

答案 1 :(得分:0)

对于所有函数 PTAk()FCAk()PCAn()CANDPARA()(对于 CANDECOMPPARAFAC),数据输入是生成的数组更有可能来自函数 array()

准备由 array() 读取的数据,您需要记住(例如对于 matrix(),对于行和列)有一个索引顺序,第一个运行得比下一个快,等等...< /p>

因此,使用 as.vector()cbind()rbind() 和所有其他数据操作可以准备要由 array() 读取的数据,然后还可能使用 {{ 1}} (package abind) 组合一些数组。

JSS paper

中给出了一些示例

例如abind() 从一系列 p 矩阵 x1,x2, ... ,xp 的维度 n x q 中创建一个三向数组 n x q x p 确实非常方便。