lapply错误-具有倍数compare.data的PGLS(雀跃)

时间:2018-12-18 13:38:15

标签: r lapply

我需要以下问题的帮助。

我生成了一个包含1000 comparative.data的列表,并且我想使用每个pgls来运行1000 comparative.data。我尝试通过以下代码使用lapply函数:

pg <- lapply(obj, function(z){pgls(formula = y ~ x, cd[[z]], lambda = "ML")})

obj是包含我的数据的1000 data.frames的列表。 cd是我的1000 comparative.data列表。

当我尝试运行此代码时,返回跟随错误:

 Error in pgls(formula = y ~ x, cd[[z]], lambda = "ML") : 
  object 'z' not found

我看不到错误的根源

预先感谢


更多信息

obj用于生成comparative.data。要使用comparative.data列表中的1000个数据帧生成1000个obj,我使用了:

cd <- lapply(1:1000, function(x) comparative.data(phy = phylogeny, 
                                            data = as.data.frame(obj[[x]]), 
                                            names.col = species_name,
                                            vcv=T, vcv.dim=3))

要以百分之一的pgls运行一个comparative.data,代码是:

mod <- pgls(formula = y ~ x, cd[[100]], lambda = "ML")

呼叫百分obj和百分cd

obj[[100]]
# A tibble: 136 x 3
# Groups:   Binomial, herbivores [136]
   Binomial                            herbivores      tm
 * <chr>                                    <dbl>   <dbl>
 1 Abies_alba                                 30. 0.896  
 2 Abies_balsamea                              2. 0.990  
 3 Abies_borisii-regis                         1. 0.940  
 4 Alcea_rosea                                 7. 0.972  
 5 Amaranthus_caudatus                         1. 0.173  
 6 Amaranthus_hybridus_subsp._cruentus         1. 0.310  
 7 Aquilegia_vulgaris                          9. 0.365  
 8 Arabidopsis_thaliana                        8. 0.00280
 9 Arabis_alpina                               2. 0.978  
10 Ariocarpus_fissuratus                       1. 0.930  
# ... with 126 more rows


cd[[100]]
Comparative dataset of 136 taxa:
Phylogeny: tree 
   136 tips, 134 internal nodes
   chr [1:136] "Mercurialis_annua" "Manihot_esculenta" 
"Malpighia_emarginata" "Comarum_palustre" ...
VCV matrix present:
   VCV.array [1:136, 1:136, 1:16] 61.9 189.3 189.3 189.3 189.3 ...
Data: as.data.frame(obj[[x]]) 
   $ herbivores: num [1:136] 4 1 1 5 19 21 7 4 4 2 ...
   $ tm        : num [1:136] 0.516 0.915 1.013 0.46 0.236 ...

1 个答案:

答案 0 :(得分:0)

由于 cd 是根据 obj 创建的,因此无需在lapply调用中引用 obj ,只需传递您的列表即可您可以按对象执行 comparative.data 的操作:

# BELOW d IS DATA FRAME OBJECT PASSED INTO LAPPLY LOOP
pg_list <- lapply(cd, function(d) pgls(formula = y ~ x, d, lambda = "ML"))

或按索引:

# BELOW i IS INTEGER VALUE PASSED INTO LAPPLY LOOP
pg_list <- lapply(seq_along(cd), function(i) pgls(formula = y ~ x, cd[[i]], lambda = "ML"))

或者,假设不需要其他目的的中间对象 cd 列表,则可以合并两个lapply调用:

# BELOW x IS OBJECT PASSED INTO LAPPLY LOOP
pg_list  <- lapply(obj, function(x) {    
                   cd <- comparative.data(phy = phylogeny, 
                                          data = as.data.frame(x), 
                                          names.col = species_name,
                                          vcv=T, vcv.dim=3))

                   pgls(formula = y ~ x, cd, lambda = "ML")
            })