Повторные вычисления по столбцам в R и сохранение вывода из списка

Я не очень часто задаю здесь вопросы, потому что обычно пытаюсь решить проблему самостоятельно (используя множество потоков stackoverflow). Тем не менее, я застрял сейчас, и я был бы признателен за некоторую помощь.

Цель:

Я хочу выполнить анализ mvabund с использованием таксона 1. ) таблица изобилия (изобилие):

ID  GoodBacteria    BadBacteria UnknownBacteria SomeBacteria
Dog 0   7337    101 0
Cat 0   4178.5  0   0
Horse   2   4294.333333 35.66666667 0
Snail   0   4350    27.5    0
Bird    0.5 4332.5  46  0
Whale   0.666666667 4809.666667 13.66666667 0
Fish    1   1522    29  0
Human   0   4679.4  28.46666667 0.033333333

и 2) файл параметров среды (факторы):

ID  Mutualistic Commensalistic  Parasitic
Dog YES NO  NO
Cat YES YES YES
Horse   NO  NO  NO
Snail   NO  NO  YES
Bird    YES YES NO
Whale   YES NO  YES
Fish    NO  NO  NO
Human   YES NO  NO

Однако исходный файл параметров среды содержит более 80 факторов, и мы хотели бы протестировать их все по отдельности.

Обычно анализ mvabund делится на три функции:

library(mvabund)    
mva <- mvabund(abundance)
mod <- manyglm(mva ~ factor(factors$Mutualistic), family="negative.binominal")
aov <- anova(mod, p.uni="adjusted")

И вывод av будет выглядеть так:

Multivariate test:
        Res.Df  Df.diff Dev Pr(>Dev)
(Intercept) 7                       
factor(factors$Salinity)    6   1   7.983   0.101

Univariate Tests:
        GoodBacteria    BadBacteria UnknownBacteria SomeBacteria       
        Dev Pr(>Dev)    Dev Pr(>Dev)    Dev Pr(>Dev)    Dev Pr(>Dev)
(Intercept)
factor(factors$Salinity)    5.489 0.090 2.41 0.259  0.085 0.770 0 1.000   

Первое решение:

Моей первой целью было выполнить все три теста (т. е. мутуалистический, комменсалистический и паразитический) столбец за столбцом, используя цикл или что-то подобное. У меня нет большого опыта в этом, но я решил это, следуя этой теме: Причинно-следственные тесты Грейнджера по столбцам в R

Это функция sapply, которую я принял, и она работает:

sapply(1:ncol(factors), function(i) {
  m1 <- anova((manyglm(mva ~ factor(factors[,i]), family="negative.binominal")), p.uni="adjusted")
  list(multip=m1$table[c(3,4)])
  })

Он выполняет anova.manyglm для каждого столбца, и я даже могу извлечь многомерные значения p для каждого столбца — не идеально, но работает:

$multip
                          Dev Pr(>Dev)
(Intercept)                NA       NA
factor(factors[, i]) 7.983104    0.112

$multip
                          Dev Pr(>Dev)
(Intercept)                NA       NA
factor(factors[, i]) 1.862846    0.702

$multip
                          Dev Pr(>Dev)
(Intercept)                NA       NA
factor(factors[, i]) 5.655806    0.228

Проблема:

Однако я также хотел бы получить одномерные результаты для каждого вида и каждого фактора. И здесь я борюсь в данный момент.

Вывод анова структурирован следующим образом:

    Length Class      Mode     
    family       1      -none-     character
    p.uni        1      -none-     character
    test         1      -none-     character
    cor.type     1      -none-     character
    resamp       1      -none-     character
    nBoot        1      -none-     numeric  
    shrink.param 2      -none-     numeric  
    n.bootsdone  1      -none-     numeric  
    table        4      data.frame list     
    uni.p        8      -none-     numeric  
    uni.test     8      -none-     numeric 

uni.p contains the p values and species names (e.g., GoodBacteria) and uni.test the Dev values and species names. But I still don't understand how I can extract these values together with the sapply function above in order to store everything in one output or dataframe.

Любая помощь будет очень высоко ценится.

Обновить

Я немного изменил сценарий

    sapply(1:ncol(factors), function(i) {
      m1 <- anova((manyglm(mva ~ factor(factors[,i]), family="negative.binominal")), p.uni="adjusted")
      unlist(data.frame(dev_p=m1$table[c(3,4)], uni_p=m1$uni.p, uni_dev=m1$uni.test))
    })

Результат выглядит сейчас так, он не идеален, но это правильное направление:

                              [,1]       [,2]         [,3]
d.Dev1                          NA         NA           NA
d.Dev2                  7.98310400 1.86284590 5.6558056350
d.Pr..Dev.1                     NA         NA           NA
d.Pr..Dev.2             0.08200000 0.64200000 0.2260000000
uni.GoodBacteria1               NA         NA           NA
uni.GoodBacteria2       0.08600000 0.62000000 0.2850000000
uni.BadBacteria1                NA         NA           NA
uni.BadBacteria2        0.25500000 0.88200000 0.9900000000
uni.UnknownBacteria1            NA         NA           NA
uni.UnknownBacteria2    0.78500000 0.78800000 0.2440000000
uni.SomeBacteria1               NA         NA           NA
uni.SomeBacteria2       1.00000000 1.00000000 1.0000000000
unidev.GoodBacteria1            NA         NA           NA
unidev.GoodBacteria2    5.48864799 1.44833012 2.4419358477
unidev.BadBacteria1             NA         NA           NA
unidev.BadBacteria2     2.40968141 0.03306757 0.0001129865
unidev.UnknownBacteria1         NA         NA           NA
unidev.UnknownBacteria2 0.08477459 0.38144821 3.2137568008
unidev.SomeBacteria1            NA         NA           NA
unidev.SomeBacteria2    0.00000000 0.00000000 0.0000000000

person plik    schedule 09.10.2017    source источник