Suite

Raster prédire à l'aide de séries temporelles lm()


J'essaie de faire une prédiction en raster en utilisant une régression linéaire basée sur des rasters passés mais je n'arrive pas à capturer le modèle lm() afin de l'alimenter à prédire().

# # calcule la régression dans une pile raster (série temporelle) # et prédit. # require(raster) require(rgdal) # crée la liste des rasters rasters <- list.files(pattern='*.tif$') # crée la pile raster s <- stack(rasters) # recadre la pile dans l'étendue of Sicily sicily_ext <- c(12, 16, 36.5, 38.5) sicily <- crop(s, sicily_ext) # créer une variable temporelle (à utiliser dans la régression) time <- 1:nlayers(s) # exécuter la régression amusante <- function(x) { if (is.na(x[1])){ NA } else {lm(x ~ time)$coefficients[2] }} x2 <- calc(sicily, fun) #predict to a raster prédit <- predict(sicily, x2, progress="text") # END

La sortie exacte est :

Chargement du package requis : raster Chargement du package requis : sp Chargement du package requis : rgdal rgdal : version : 1.0-6, (révision SVN 555) Extensions de la bibliothèque d'abstraction de données géospatiales vers R chargées avec succès Runtime GDAL chargé : GDAL 1.11.2, publié 2015/02 /10 Chemin d'accès aux fichiers partagés GDAL : /usr/share/gdal/1.11 Runtime PROJ.4 chargé : Rel. 4.8.0, 6 mars 2012, [PJ_VERSION : 480] Chemin vers les fichiers partagés PROJ.4 : (autodétecté) Lien vers la version sp : 1.1-1 0%Error in UseMethod("predict") : aucune méthode applicable pour 'predict' appliqué à un objet de classe "data.frame"

et le raster x2 résultant est affiché ici


Vous ne pouvez pas utiliserprédireici.prédirefonctionnerait si vous aviez un modèle global et que vous vouliez calculer des prédictions au niveau local (cellule de grille). Mais il semble que vous souhaitiez ajuster des modèles locaux (un modèle différent pour chaque cellule de la grille) et faire des prédictions avec ceux-ci.

Avec ces étapes

fun <- function(x) { if (is.na(x[1])){ NA } else {lm(x ~ time)$coefficients[2] }} x2 <- calc(sicily, fun)

Vous avez la pente. Vous pouvez obtenir à la fois la pente et l'interception et calculer manuellement les valeurs comme ceci :

# obtenir tous les coefficients bfun <- function(x) { if (is.na(x[1])){ c(NA, NA) } else {lm(x ~ time)$coefficients}} x <- calc(sicily , bfun) p1 <- x[[1]] + x[[2]] * temps

Ou en une seule étape

pfun <- function(x) { if (is.na(x[1])){ rep(NA, length(x)) } else { predict( lm(x ~ time))}} p2 <- calc(sicily , pfun)

Tant qu'il s'agit d'une régression linéaire, vous pouvez simplement créer deux couches raster - une pour la pente, une pour l'interception - et faire la prédiction manuellement (c'est-à-dire, y = m*x + t). Voici un exemple de code utilisant les données GIMMS NDVI téléchargées et traitées à l'aide du trucs paquet. Vous devriez pouvoir le remplacer par n'importe quel type de données que vous traitez.

## charger la bibliothèque de packages 'gimms' (gimms) ## acquérir des exemples de données gimms_envi <- downloadGimms(as.Date("2000-01-01"), as.Date("2000-06-30")) gimms_tifs <- rasterizeGimms(gimms_envi, remove_header = TRUE, filename = gimms_envi, format = "GTiff") ## create spatial subset (sicily) sicily_ext <-ext(c(12, 16, 36.5, 38.5)) gimms_tifs <- crop(gimms_tifs, sicily_ext) ) ## créer des horodatages d'informations temporelles <- 1:nlayers(gimms_tifs) ## pente et intercepter lm_intercept <- calc(gimms_tifs, fun = function(x) { if (all(is.na(x))) return(NA) else return(coef(lm(x ~ timestamps))[1]) }) lm_slope <- calc(gimms_tifs, fun = function(x) { if (all(is.na(x))) return(NA) else return (coef(lm(x ~ timestamps))[2]) }) ## prédire ndvi (y = m*x + t) lm_slope * gimms_tifs + lm_intercept

Un vieux sujet. Mais peut être utile à quelqu'un. Exemple de base :

library(raster) set.seed(321) # rend cet exemple entièrement reproductible r <- raster() res(r) <- c(5,5) r_list <- list() time <- seq(8) for (i dans le temps) { r_list[[i]] <- setValues(x = r, values ​​= rnorm(n = ncell(r), mean = i, sd = 0.1)) } sicile <- stack(r_list)

Est-ce la même approche que @RobertH, mais en ajoutantnouvelles donnéesargument dans la prédiction :

# approche pixel par pixel pfun <- function(x) { if (is.na(x[1])){ rep(NA, length(x)) } else { predict( lm(x ~ time), newdata = data.frame(time = c(9:12)))}} p2 <- calc(sicily, pfun) rasterVis::levelplot(stack(sicily,p2))

Et le but de @jim, à la recherche d'un ajustement global :

# bibliothèque de modèles globale(dplyr) bibliothèque(tidyr) df <- as.data.frame(sicily) names(df) <- time df %>% recueillir(key = 'time', value = 'x') %>% muter(time = as.numeric(time)) %>% lm(x ~ time, data = .) %>% predict(newdata = data.frame(time = c(9:12))) ## 1 2 3 4 ## 8.996832 9.996315 10.995799 11.995282

Mais, la sortie n'est qu'une valeur par pas de temps


Voir la vidéo: lm 2 (Octobre 2021).