所以,我正在使用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似乎并不相信我的矩阵实际上是一个矩阵。有什么想法吗?
答案 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! :)