【问题标题】:R: Random forest with raster as response and explanitory variableR:以栅格作为响应和解释变量的随机森林
【发布时间】:2022-01-16 23:18:41
【问题描述】:

我想用随机森林法创建火灾发生概率图。我的响应变量是一个栅格,每个网格单元的平均年燃烧面积。我的解释变量是多个栅格(温度、海拔、土地利用和人口密度)。是否可以使用栅格作为响应变量以及基本代码线的外观如何?我找不到任何相关信息。

files <- list.files(path="C:/Users/fsorb/OneDrive/Desktop/test/fire_prob", pattern="grd", all.files=FALSE, full.names=TRUE,recursive=TRUE)
predictors <- stack(files)
fire <- raster("C:/Users/fsorb/OneDrive/Desktop/test/env_data/fire.tif")
fire_occ_prob <- randomForest(fire ~ ., data = predictors, ntree=500)

到目前为止我的代码也是如此,但我收到错误:as.data.frame.default(data) 中的错误: 不能将‘structure("RasterStack", package = "raster")’转换成data.frame

我尝试将火焰栅格另存为.dataframe,但所有网格单元格仅获得 NA 值。

【问题讨论】:

    标签: r probability random-forest raster


    【解决方案1】:

    我会努力的

    1. 将响应(火灾)栅格转换为点
    2. 提取点处的预测变量值
    3. 使用生成的数据框训练随机森林模型。
    require(raster)
    require(sf)
    require(dplyr)
    require(randomForest)
    
    files <- list.files(path="C:/Users/fsorb/OneDrive/Desktop/test/fire_prob", pattern="grd", all.files=FALSE, full.names=TRUE,recursive=TRUE)
    predictors <- stack(files)
    fire <- raster("C:/Users/fsorb/OneDrive/Desktop/test/env_data/fire.tif")
    
    # convert raster to point
    response <- rasterToPoints(fire, spatial = TRUE) %>% st_as_sf()
    response$ID <- c(1:nrow(response))
    colnames(response)[1] <- "response"
    
    # combine predictor values with the response
    rs_preds <- full_join(terra::extract(x=r2, y=response, df=TRUE), 
                          st_drop_geometry(response), by="ID")
    
    # train random forest
    fire_occ_prob <- randomForest(response ~ .,
                                  data = rs_preds[,!names(rs_preds) %in% "ID"],
                                  ntree=500,
                                  importance = TRUE)
    # plot variable importance
    varImpPlot(fire_occ_prob)
    
    # make spatial predictions
    sp_pred <- raster::predict(predictors, model=fire_occ_prob)
    

    如果您的目标是进行空间(时间)预测,请确保使用空间(时间)(交叉)验证策略。有关更多信息,请查看例如罗伯茨等人。 (2016):https://doi.org/10.1111/ecog.02881

    你好,一月

    【讨论】:

    • 感谢您的回答。起初我收到函数“terra”不可用的错误,所以我安装了 terra 包(我猜这是正确的包?)。现在我收到以下错误代码:(函数(类,fdef,mtable)中的错误:无法找到签名“RasterLayer”,“sf”的函数“提取”的继承方法
    • 还有一个问题:在代码行中:“rs_preds
    • 嗨弗雷迪,我在提取函数中打错了:您可以用预测变量替换“r2” - 正确的代码行是:rs_preds &lt;- full_join(terra::extract(x=predictors, y=response, df=TRUE), st_drop_geometry(response), by="ID")
    • 这是有道理的。但是,我仍然得到与以前相同的错误代码:(函数(类,fdef,mtable)中的错误:无法找到签名'“RasterStack”,“sf”的函数'extract'的继承方法。任何想法原因?
    • 您好 Freddy,也许 terra 包对简单的特征对象有问题。尝试将 sf 对象(响应)转换为 SpatVect 对象:rs_preds &lt;- full_join(terra::extract(x=predictors, y=vect(response), df=TRUE), st_drop_geometry(response), by="ID")
    猜你喜欢
    • 2021-03-27
    • 1970-01-01
    • 2021-03-12
    • 2020-11-10
    • 2019-02-26
    • 2013-02-06
    • 2015-09-29
    • 2015-12-11
    • 1970-01-01
    相关资源
    最近更新 更多