使用配对数据创建数据集并将其转换为矩阵

时间:2016-10-07 14:42:00

标签: r matrix dataframe missing-data

所以,我正在使用R来尝试在我使用phytools包中的phyl.pca函数的数据集上进行系统发育PCA。但是,我在以函数接受的方式组织数据时遇到问题!这还不是全部:我做了一些实验,我知道还有更多的问题,我将进入...

直接讨论这个问题,这是我正在使用的数据框(带有虚拟数据):

>all
                  Taxa Tibia Feather
1          Microraptor 138   101
2          Microraptor 139   114
3          Microraptor 145   141
4           Anchiornis 160   81
5           Anchiornis 14    NA
6        Archaeopteryx 134   82
7        Archaeopteryx 136   71
8        Archaeopteryx 132   NA
9        Archaeopteryx 14    NA
10 Scansoriopterygidae 120   85
11 Scansoriopterygidae 116   NA
12 Scansoriopterygidae 123   NA
13           Sapeornis 108   NA
14           Sapeornis 112   86
15           Sapeornis 118   NA
16           Sapeornis 103   NA
17      Confuciusornis 96    NA
18      Confuciusornis 107   30
19      Confuciusornis 148   33
20      Confuciusornis 128   61

将分类群排列成一棵树(称为“树”),其中Microraptor是最基础的,然后顺序进入孔子学院:

>summary(tree)

Phylogenetic tree: tree 

  Number of tips: 6 
  Number of nodes: 5 
  Branch lengths:
    mean: 1 
    variance: 0 
    distribution summary:
   Min. 1st Qu.  Median 3rd Qu.    Max. 
      1       1       1       1       1 
  No root edge.
  Tip labels: Confuciusornis 
              Sapeornis
              Scansoriopterygidae
              Archaeopteryx
              Anchiornis
              Microraptor
  No node labels.

功能:

>phyl.pca(tree, all, method="BM", mode="corr")

这就是即将出现的错误:

Error in phyl.pca(tree, all, method = "BM", mode = "corr") : 
number of rows in Y cannot be greater than number of taxa in your tree

Y是“全部”数据框。所以我的树中有6个分类单元(匹配数据框中的6个分类单元)但我的数据框中有20行。所以我使用了这个功能:

> all_agg <- aggregate(all[,-1],by=list(all$Taxa),mean,na.rm=TRUE)

得到了这个:

              Group.1 Tibia Feather
1          Anchiornis   153      81
2       Archaeopteryx   136      77
3      Confuciusornis   120      41
4         Microraptor   141     119
5           Sapeornis   110      86
6 Scansoriopterygidae   120      85

分类群的顺序发生变化有点奇怪......这样可以吗?

无论如何,我把它转换成矩阵:

> all_agg_matrix <- as.matrix(all_agg)
> all_agg_matrix
                 Group.1   Tibia Feather
[1,]          "Anchiornis" "153"    "81"
[2,]       "Archaeopteryx" "136"    "77"
[3,]      "Confuciusornis" "120"    "41"
[4,]         "Microraptor" "141"   "119"
[5,]           "Sapeornis" "110"    "86"
[6,] "Scansoriopterygidae" "120"    "85"

然后使用phyl.pca函数:

> phyl.pca(tree, all_agg_matrix, method = "BM", mode = "corr")
[1] "Y has no names. function will assume that the row order of Y matches tree$tip.label"
Error in invC %*% X : requires numeric/complex matrix/vector arguments

所以,现在函数正在考虑分类的顺序是错误的(但我可以相对容易地解决)。问题是phyl.pca似乎并不相信我的矩阵实际上是一个矩阵。有什么想法吗?

2 个答案:

答案 0 :(得分:0)

我认为你可能有更大的问题。我怀疑包括phyl.pca在内的大多数系统发育方法都假设特征在物种水平上是固定的(即它们不能解释种内变异)。因此,如果您想使用phyl.pca,则可能需要将数据折叠为每个物种的单个值,例如通过

dd_agg <- aggregate(dd[,-1],by=list(dd$Taxa),mean,na.rm=TRUE)

提取数字列并正确标记行,以便phyl.pca可以正确匹配它们:

dd_mat <- dd_agg[,-1]
rownames(dd_mat) <- dd_agg[,1]

使用这些汇总数据,我可以组成一棵树(因为你没有给我们一个)并运行phyl.pca ......

library(phytools)
tt <- rcoal(nrow(dd_agg),tip.label=dd_agg[,1])
phyl.pca(tt,dd_mat)

如果您确实需要进行分析,将种内变异考虑在内,您可能需要在某处更专业地询问,例如: r-sig-phylo@r-project.org邮件列表......

答案 1 :(得分:0)

Ben Bolker发布的答案似乎有效,在创建矩阵和运行函数之前,数据(称为“all”)会折叠为每个物种的单个值。按照:

> all_agg <- aggregate(all[,-1],by=list(all$Taxa),mean,na.rm=TRUE)
> all_mat <- all_agg[,-1]
> rownames(all_mat) <- all_agg[,1]
> phyl.pca(tree,all_mat, method= "lambda", mode = "corr")

感谢所有提供答案的人,特别是Ben! :)