我正在为一组植物物种在性状和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
中?
答案 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)
存储数据。