【问题标题】:Predicting to raster stack at population level with glmmTMB in R在 R 中使用 glmmTMB 预测人口级别的栅格堆栈
【发布时间】:2020-12-16 19:14:33
【问题描述】:

我正在尝试使用我适合 glmmTMB 包的 GLMM 在人口级别预测 R 中的栅格堆栈(即将随机效应设置为 0)。我在this thread 中遵循了 Ben Bolker 的解决方案,该解决方案适用于适合lme4 的模型,但即使函数参数re.form=~0 似乎适用于predict.glmmTMB 除了predict.merMod,当我使用 glmmTMB 模型进行预测。下面是一个使用 Robert Hijmans 在上述线程中提供的相同示例代码的示例:

# example data. See ?raster::predict
logo <- brick(system.file("external/rlogo.grd", package="raster"))
p <- matrix(c(48, 48, 48, 53, 50, 46, 54, 70, 84, 85, 74, 84, 95, 85, 
   66, 42, 26, 4, 19, 17, 7, 14, 26, 29, 39, 45, 51, 56, 46, 38, 31, 
   22, 34, 60, 70, 73, 63, 46, 43, 28), ncol=2)
a <- matrix(c(22, 33, 64, 85, 92, 94, 59, 27, 30, 64, 60, 33, 31, 9,
   99, 67, 15, 5, 4, 30, 8, 37, 42, 27, 19, 69, 60, 73, 3, 5, 21,
   37, 52, 70, 74, 9, 13, 4, 17, 47), ncol=2)
xy <- rbind(cbind(1, p), cbind(0, a))
v <- data.frame(cbind(pa=xy[,1], extract(logo, xy[,2:3])))
v$Year <- sample(2000:2001, nrow(v), replace=TRUE) 

#fit model using glmmTMB
library(glmmTMB)
m <- glmmTMB(pa ~ red + blue + (1 | Year), data=v)

# use argument "re.form=~0" to make population-level prediction
x <- predict(logo, m, re.form=~0)

当我运行上面的 predict 代码(生成对象 x)时,我收到错误:Error in eval(predvars, data, env) : object 'Year' not found。谁能告诉我我可能做错了什么或如何解决这个问题?

【问题讨论】:

    标签: r raster predict mixed-models glmmtmb


    【解决方案1】:

    由于“年份”不是预测栅格,您需要以不同的方式提供它。 你可以这样做

    x2000 <- predict(logo, m, re.form=~0, const=data.frame(Year=2000))
    x2001 <- predict(logo, m, re.form=~0, const=data.frame(Year=2001))
    

    这是等效的(但效率较低)

    logo$Year <- 2000
    x2000 <- predict(logo, m, re.form=~0)
    

    如果有很多年,也许像

     years <- c(2000, 2001)
     s <- list()
     for (i in 1:length(years)) {
        s[[i]] <- predict(logo, m, re.form=~0, const=data.frame(Year=years[i]))
     }
     s <- stack(s)
     sm <- mean(s)
    

    【讨论】:

    • 感谢您的帮助!我没有在我的帖子中提到这一点,因为我不确定它是否相关,但我的数据集中实际上有两个随机效应(它们是“站点”和“年份”)。有没有办法修改上面的示例以适应两种随机效应?
    • const=data.frame(Year=2001, site=3)
    • 啊,谢谢,我不知道这个参数可以接受多个常量
    【解决方案2】:

    该错误有点不透明地表明,您的测试数据“logo”没有“Year”变量。

    我只是在此处添加了相关代码,并没有重复您上面提供的所有其他代码。

    logo <- brick(system.file("external/rlogo.grd", package="raster"))
    x <- predict(logo, m, re.form=~0)
    Error in eval(predvars, data, env) : object 'Year' not found
    
    logo$Year <- sample(2000:2001, ncell(logo), replace=TRUE) 
    x <- predict(logo, m, re.form=~0)
    > x
    class      : RasterLayer 
    dimensions : 77, 101, 7777  (nrow, ncol, ncell)
    resolution : 1, 1  (x, y)
    extent     : 0, 101, 0, 77  (xmin, xmax, ymin, ymax)
    crs        : +proj=merc +lon_0=0 +k=1 +x_0=0 +y_0=0 +datum=WGS84 +units=m +no_defs 
    source     : memory
    names      : layer 
    values     : 0.1260796, 1.690493  (min, max)
    

    【讨论】:

    • 感谢您的回答!因此,您的解决方案基本上是提供随机效果的随机值作为栅格堆栈中的一个图层。您是否认为只需提供一个新值作为常数(例如 logo$Year
    • 不客气。我的回答更多是关于为什么您会收到错误并且没有正确解决您的模型。看起来 Robert Hijmans 为您提供了更好的答案。
    猜你喜欢
    • 2015-10-07
    • 2021-02-13
    • 2018-10-06
    • 2023-04-04
    • 1970-01-01
    • 2020-06-22
    • 1970-01-01
    • 2016-10-05
    • 1970-01-01
    相关资源
    最近更新 更多