【问题标题】:How to format 'const' argument in Terra::Predict?如何在 Terra::Predict 中格式化“const”参数?
【发布时间】:2022-02-25 14:04:54
【问题描述】:

问题: 如何格式化 Terra 包中预测函数的“const”参数?

背景和细节:

我正在使用 Terra 的预测功能从模型创建空间地图。当我为我的三个常量值创建完整的栅格时,该函数按预期工作。当我看到 predict 对常量有一个参数 'const' 时,我决定改用它。不幸的是,帮助文档没有指定如何构造数据,超出了它们应该在数据框中的结构。

来自?terra::predict的'const'的参数描述:

data.frame。可用于添加一个常量值作为预测变量,这样您就不需要为其制作 SpatRaster 图层

文档底部列出的任何示例中也没有使用该参数。

我尝试了什么:

我尝试将数据框格式化为单行,其中包含模型中所需的每个常量值的命名列。该函数接受它并发出警告:

警告信息: 1:在 data.frame(..., check.names = FALSE) : 行名是从一个短变量中找到的,已被丢弃

但这在结果输出中产生了明显不正确的值。可能只是对所有三个常量使用了第一个值,但我不知道。

我还尝试用两列格式化数据框,一列用于变量名称,另一列用于变量值。这失败并出现以下错误:

h(simpleError(msg, call)) 中的错误: 在为函数“writeRaster”选择方法时评估参数“x”时出错:参数暗示不同的行数:10000、3

10000 可能指的是栅格数据的维度 (10k x 10k),而 3 可能指的是我提供的常量数据帧中的三行。

我不想再为每个常量编写栅格,因为我要生成许多地图,并且每个地图都需要使用常量值生成 3 个 10k x 10k 栅格,这很耗时并且可能会导致内存占用问题。

任何建议将不胜感激!

【问题讨论】:

    标签: r predict terra


    【解决方案1】:

    这是一个插图

    library(terra)
    logo <- rast(system.file("ex/logo.tif", package="terra"))   
    names(logo) <- c("red", "green", "blue")
    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))
    e <- extract(logo, xy[,2:3])
    v <- data.frame(cbind(pa=xy[,1], e))
    
    model <- glm(formula=pa~., data=v)
    
    names(model$coefficients)[-1]
    #[1] "red"   "green" "blue" 
    names(logo)
    #[1] "red"   "green" "blue" 
    
    # standard approach
    r <- predict(logo, model)
    
    # one or more constants 
    r <- predict(logo[[2:3]], model, const=data.frame(red=0))
    r <- predict(logo$blue, model, const=data.frame(red=100, green=0))
    
    # you could even use constants only 
    x <- logo[[1]]
    names(x) <- "A"
    r <- predict(x, model, const=data.frame(blue=50, red=100, green=0))
    

    输出如预期:

    predict(model, data.frame(blue=50, red=100, green=0))
    #        1 
    #-4.538653 
    
    r[1]
    #          A
    #1 -4.538653
    

    【讨论】:

    • 我对此仍有疑问。我不再收到警告消息,但我在输出中得到明显不正确的结果。对常量使用栅格可以提供良好的结果,但使用 const 参数却不能。当我使用 const 参数时,似乎某些数据层被忽略或分配错误。我验证了这些值是数字,并且列名与预测变量名称相同。
    • 我用不同的const 参数多次运行了预测函数。当我输入实际值(27.67、180、1093.15)、全零(0、0、0)和所有字符串(“A”、“A”、“A”)时,我得到了非常相似(尽管不相同)的结果.这尤其奇怪,因为这三个常量变量构成了模型权重的 95% 左右,所以任何变化都应该是显而易见的。
    • 我只能说上面的例子有效。这并不意味着它适用于所有情况。如果类似的东西对您不起作用,那么您应该举一个像上面这样的例子来表明某些东西不起作用,并提出一个新问题。使用字符串是可疑的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-07
    • 2014-08-08
    • 2022-11-17
    相关资源
    最近更新 更多