【问题标题】:multivariate random forest on a community matrix社区矩阵上的多元随机森林
【发布时间】:2019-09-02 13:51:44
【问题描述】:

我想使用随机森林建模来了解社区组装的变量重要性 - 我的响应数据是社区矩阵。

library(randomForestSRC)

# simulated species matrix
species 
# site       species 1    species2     species 3
# 1             1            1            0
# 2             1            0            1
# 3             1            1            1
# 4             1            0            1
# 5             1            0            0
# 6             1            1            0
# 7             1            1            0
# 8             1            0            0
# 9             1            0            0
# 10            1            1            0


# environmental data
data
# site   elevation_m     PRECIPITATION_mm  
# 1        500                28
# 2        140                37
# 3        445                15
# 4        340                45
# 5        448                20
# 6        55                 70
# 7        320                18
# 8        200                42
# 9        420                22
# 10       180                8


# adding my species matrix into the environmental data frame
data[["species"]] <-(species)

# running the model
rf_model <- rfsrc(Multivar(species) ~.,data = data, importance = T)

但我收到一条错误消息:

Error in parseFormula(formula, data, ytry) : 
  the y-outcome must be either real or a factor.

我猜问题出在存在/不存在数据上,但我不确定如何解决这个问题。这是功能的限制吗?

【问题讨论】:

    标签: r random-forest


    【解决方案1】:

    这是一个示例,使用来自 vegan 包的示例数据,自动构建一个公式,其中包含响应中的所有物种名称:

    library(vegan)
    library(randomForestSRC)
    data("dune.env")
    data("dune")
    
    all <- as.data.frame(cbind(dune,dune.env))
    form <- formula(sprintf("Multivar(%s) ~ .",
                            paste(colnames(dune),collapse=",")))
    
    rfsrc(form, data=all)
    

    假设我们要对 2000 个物种进行此操作。这是一个模拟示例:

    nsp <- 2000
    nsamp <- 100
    nenv <- 10
    set.seed(101)
    spmat <- matrix(rpois(nsp*nsamp, lambda=5), ncol=nsp,
                    dimnames=list(NULL,paste0("sp",seq(nsp))))
    envmat <- matrix(rnorm(nenv*nsamp), ncol=nenv,
                    dimnames=list(NULL,paste0("env",seq(nenv))))
    
    all2 <- as.data.frame(cbind(spmat,envmat))
    form2 <- formula(sprintf("Multivar(%s) ~ .",
                            paste(colnames(spmat),collapse=",")))
    
    rfsrc(form2, data=all2)
    

    在这个特殊的例子中,我们似乎解释了 -3% (!!) 的方差,但它并没有崩溃,所以这是一件好事......

    【讨论】:

      【解决方案2】:

      我认为这可能与您构建“数据”数据框的方式有关。当您使用data[["species"]] &lt;- (species) 时,您在数据框内有一个数据框。如果你在我刚才提到的步骤之后str(data),输出是这样的:

      > str(data)
      'data.frame':   10 obs. of  4 variables:
      $ site     : int  1 2 3 4 5 6 7 8 9 10
      $ elevation: num  500 140 445 340 448 55 320 200 420 180
      $ precip   : num  28 37 15 45 20 70 18 42 22 8
      $ species  :'data.frame':      10 obs. of  4 variables: #2nd data frame
      ..$ site     : int  1 2 3 4 5 6 7 8 9 10
      ..$ species.1: num  1 1 1 1 1 1 1 1 1 1
      ..$ species2 : num  1 0 1 0 0 1 1 0 0 1
      ..$ species.3: num  0 1 1 1 0 0 0 0 0 0
      

      如果您改为将数据框构建为 data2 &lt;- as.data.frame(cbind(data,species)) ,然后

      rfsrc(Multivar(species.1,species2,species.3)~.,data = data2, importance=T)
      

      似乎可以工作,因为我没有收到错误消息,而是得到了一些看起来合理的输出:

      Sample size: 10
      Number of trees: 1000
      Forest terminal node size: 5
      Average no. of terminal nodes: 2
      No. of variables tried at each split: 2
      Total no. of variables: 4
      Total no. of responses: 3
      User has requested response: species.1
      Resampling used to grow trees: swr
      Resample size used to grow trees: 10
      Analysis: mRF-R
      Family: regr+
      Splitting rule: mv.mse *random*
      Number of random split points: 10
      % variance explained: NaN
      Error rate: 0   
      

      我认为您构建所需数据框的方法不是惯用的方法,但我可能错了。我认为rfsrc() 不知道如何读取嵌套数据框。我怀疑大多数建模功能都不需要额外的定制代码。

      【讨论】:

      • 嗯,问题是实际上我有大约 2000 个物种(微生物数据),所以我不知道如何将这么多变量分组到方程的“y”部分。至少我们知道这不是 p/a 数据!这是有道理的,虽然该函数不知道如何处理嵌套数据框。
      • 您的问题是关于函数为什么会抛出错误。您的评论似乎改变了焦点:当您有很多变量要参考时,设置模型的左侧。您可以就此提出一个新问题。无论如何,如果我提供的答案解决了有关错误的问题,您应该将问题标记为已回答。
      • 我不完全相信这是问题所在 - 你的代码有效,但我也运行了与上面相同的代码,除了我的物种 df 是丰度数据(物种
      猜你喜欢
      • 2014-07-08
      • 2020-06-01
      • 2021-05-02
      • 2018-03-30
      • 1970-01-01
      • 2021-07-08
      • 2020-11-17
      • 2017-03-15
      • 2018-07-10
      相关资源
      最近更新 更多