是否有R循环函数(data.table)在不超过内存限制的情况下运行100多个`gam`结果?

问题描述 投票:1回答:1

使用gam的空间插值

Statement

我希望使用通用加性模型(GAM)获得许多空间插值输出。预测单个污染图没有问题,但是,我需要100多个图。如果可能的话,我想实现自动化,并在不超出内存限制的情况下获得结果。

使用GAM(mgcv程序包]的空间插值过程

仅告诉您,这是获取插值地图的基本步骤。

  • 获取污染监测站的X,Y坐标
  • 获取每个站点的污染数据
  • 将污染数据添加到包含X,Y坐标的数据框中
  • 对每个污染列运行gam(pollution ~ s(X,Y, k=20))
  • 使用minmax X,Y坐标作为空间范围创建一个空数据框
  • 使用predictgam结果预测空间范围
  • 在所有污染领域执行相同的工作

我将展示一个实践方法的实际例子。

样本数据

举个例子,我创建了一个数据集,如下所示。从df,您将意识到我有X Y和3个污染变量。

library(data.table)
library(mgcv)

X <- c(197745.8,200443.8,200427.6,208213.4,203691.1,208303.0,202546.4,202407.9,202564.8,194095.5,194508.0,195183.8,185432.5,
       190249.0,190927.0,197490.1,193551.5,204204.4,199508.4,210201.4,212088.3,191886.5,201045.2,187321.7,205987.0)
Y <- c(451633.1,452496.8,448949.5,449753.3,449282.2,453928.5,452923.2,456347.9,461614.8,456729.3,453019.7,450039.7,449472.0,
       444348.1,447274.4,442390.0,443101.2,446446.5,445008.5,446765.2,449508.5,439225.3,460915.6,447392.0,461985.3)
poll1 <- c(34,29,29,33,33,38,35,30,41,43,35,34,41,41,40,36,35,27,53,40,37,32,28,36,33)
poll2 <- c(27,27,34,30,38,36,36,35,37,39,35,33,41,42,40,34,38,31,43,46,38,32,29,33,34)
poll3 <- c(26,30,27,30,37,41,36,36,35,35,35,33,41,36,38,35,34,24,40,43,36,33,30,32,36)

df <- data.table(X, Y, poll1, poll2, poll3)

我的工作方式

1。硬编码

如果您看下面的代码,您会意识到我将同一作业复制并粘贴到所有变量中。这将很难实现很多变量。

# Run gam
gam1 <- gam(poll1 ~ s(X,Y, k=20), data = df)
gam2 <- gam(poll2 ~ s(X,Y, k=20), data = df)
gam3 <- gam(poll3 ~ s(X,Y, k=20), data = df)
         # "there are over 5000 variables that needs looping


# Create an empty surface for prediction
GAM_poll <- data.frame(expand.grid(X = seq(min(df$X), max(df$X), length=200),
                                   Y = seq(min(df$Y), max(df$Y), length=200)))


# Predict gam results to the empty surface
GAM_poll$gam1 <- predict(gam1, GAM_poll, type = "response")
GAM_poll$gam2 <- predict(gam2, GAM_poll, type = "response")
GAM_poll$gam3 <- predict(gam3, GAM_poll, type = "response")

2。使用for循环

相反,我列出了清单,并尝试循环所有变量以获取结果。当然,它本身没有问题,但是对多个变量进行迭代将占用所有内存(这是我的经验)。# Run gam using list and for loop myList <- list() for(i in 3:length(df)){ myList[[i-2]] <- gam(df[[i]] ~ s(X,Y, k=20), data = df) } # Create an empty surface for prediction GAM_poll <- data.frame(expand.grid(X = seq(min(df$X), max(df$X), length=200), Y = seq(min(df$Y), max(df$Y), length=200))) # Predict gam results to the empty surface myResult <- list() for(j in 1:length(myList)){ myResult[[j]] <- predict(myList[[j]], GAM_poll, type = "response") }

寻求帮助

    是否有更好的方法来获取多个变量的gam结果?

  • 在实现过程中是否有不超过内存限制的方法?
  • 您能帮我data.tablepurrr位用户吗?

    使用gam语句进行空间插值我希望使用广义加性模型(GAM)获得许多空间插值输出。预测单个污染图没有问题,...

  • r list for-loop data.table gam
    1个回答
    0
    投票
    我创建的解决方案仅将最新的预测保留在内存中,并将其他预测保存到磁盘中,然后再用下一个解决方案覆盖它。这些文件是在名为result的文件夹中的模型列名称之后命名的。我也融化了data.table,主要是因为我认为这种方式使代码更加清晰。
    © www.soinside.com 2019 - 2024. All rights reserved.