【问题标题】:Extracting p-values from lineair regression on raster image through calc function (in R)通过 calc 函数(在 R 中)从光栅图像的线性回归中提取 p 值
【发布时间】:2020-09-14 15:21:40
【问题描述】:

对于几年前回答的关于在栅格堆栈上进行线性回归的问题,我基本上有一个后续问题。 (见Linear regression on raster images - lm complains about NAs) 我进行了线性回归并使用 $coefficients 中的值计算了趋势,但现在想知道相关的 p 值(每个光栅像素一个)。

但是,calc 抱怨找不到签名“integer”、“function”的函数“calc”的继承方法

您可以使用以下代码重现此错误:

library(raster)
names = c('...','...','...','...','...')
s <- stack(names)
y <- values(s)
x <- log(c(10,20,30,40,50))    
funa <- function(y) { 
        if(all(is.na(y))) {
            c(NA, NA)
        } else {
            summary(lm(y ~ x))$coefficients
        }
    }
    r <- calc(s, funa)

我可以理解 calc 不知道如何将 summary 的输出转换为新的栅格堆栈。因此,我尝试将 lm 的输出重塑为其他形式,例如使用“broom”包,但无济于事。现在 calc 抱怨说: is.infinite(v) 中的错误:即使我尝试强制输出到 data.frame 或 as.numeric,也没有为类型“list”实现默认方法。比如这样

library(broom)
funlm <- function(y) {
    if(all(is.na(y))) {
        c(NA, NA)
    } else {
        as.data.frame(glance(lm(y ~ x)))
    }
}
r <- calc(s, funlm)

请帮忙

【问题讨论】:

    标签: r lm r-raster p-value


    【解决方案1】:

    这里是一个例子,基于?calc中的例子

    # create data
    library(raster)
    r <- raster(nrow=10, ncol=10)
    s1 <- lapply(1:12, function(i) setValues(r, rnorm(ncell(r), i, 3)))
    s2 <- lapply(1:12, function(i) setValues(r, rnorm(ncell(r), i, 3)))
    s1 <- stack(s1)
    s2 <- stack(s2)
    
    # regression of values in one brick (or stack) with another, extract p-values
    s <- stack(s1, s2)
    fun <- function(x) {
        if (all(is.na(x))) {
           return(c(NA, NA))
        } 
        m <- lm(x[1:12] ~ x[13:24])
        summary(m)$coefficients[,4]
    }
    x1 <- calc(s, fun)
    

    【讨论】:

    • 谢谢!所以我错过了保存lm输出然后提取系数的步骤......
    • 在我看来,您错过了从系数 data.frame 中提取一列。
    猜你喜欢
    • 2018-06-20
    • 2011-08-01
    • 2015-10-12
    • 2016-01-03
    • 1970-01-01
    • 2021-01-02
    • 1970-01-01
    相关资源
    最近更新 更多