PGLS在Caper对象中按变量的列位置引用变量时返回错误

时间:2018-08-31 02:33:04

标签: r phylogeny

我正在为一组植物物种在性状和21个环境变量之间进行PGLS的操作。我使用循环执行21次,对每个环境变量执行一次,然后将p值和其他一些值提取到结果矩阵中。

通常通常单独携带每个PGLS时,我将通过其列名称来引用变量,例如:

pgls(**trait1**~**meanrainfall**, data=caperobject)

但是为了使此过程循环到多个环境变量,我要通过变量在数据框中的列位置(以PGLS的caper对象的形式)而不是其列名来引用这些变量:

pgls(**caperobject[,2]**~**caperobject[,5]**, data=caperobject)

这将返回错误:

Error in model.frame.default(formula, data$data, na.action = na.pass) : invalid type (list) for variable 'caperobject[, 2]'

在使用原始数据帧运行线性回归时,这不是问题-仅当将雀跃对象用作使用PGLS的数据时,通过列名引用变量才会产生此错误。这种引用列名的方式对雀跃对象不起作用吗?有没有其他方法可以引用列名,以便将其合并到PGLS loop中?

1 个答案:

答案 0 :(得分:0)

您的解决方案是使用caperobject$data[,2] ~ caperobject$data[,5],因为comparative.data类是具有特征值的列表,列表位于列表data中。这是一个示例:

library(ape)
library(caper)

# generate random data
seed <- 245937
tr <- rtree(10)
dat <- data.frame(taxa = tr$tip.label, 
                  trait1 = rTraitCont(tr, root.value = 3), 
                  meanrainfall = rnorm(10, 50, 10))

# prepare a comparative.data structure 
caperobject <- comparative.data(tr, dat, taxa, vcv = TRUE, vcv.dim = 3)

# run PGLS
pgls(trait1 ~ meanrainfall, data = caperobject)
pgls(caperobject$data[, 1] ~ caperobject$data[, 2], data = caperobject)

两个选项的截距= 3.13和斜率= -0.003都返回相同的值。

关于数据格式问题的一个好习惯是检查如何用str(caperobject)存储数据。