首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >是否有一个R循环函数(data.table)可以在不超过内存限制的情况下运行超过100个的“`gam`”结果?

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

Stack Overflow用户
提问于 2020-02-20 15:46:52
回答 1查看 343关注 0票数 1

基于gam的空间插值

语句

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

基于GAM的空间插值处理(**mgcv** package)

为了让你知道,下面是得到插值地图的基本步骤。

得到污染监测站的X,Y坐标,得到每个监测站的污染数据,将污染数据添加到每个污染监测站的数据框架中,其中含有X,Y coordinates

  • Run gam(pollution ~ s(X,Y, k=20))的污染数据以minmax X,Y坐标作为空间extent

  • Predict,空间范围使用d23和gam结果H 225/code>H 126运行在所有污染字段H 227F 228

我将展示一个亲身的例子,说明我是如何对待它的。

样本数据

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

代码语言:javascript
运行
复制
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.硬代码

如果您查看下面的代码,您就会意识到我复制并粘贴了相同的任务到所有变量。这将非常难实现许多变量。

代码语言:javascript
运行
复制
# 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")

for 2.使用循环

相反,我列出了一个列表,并试图循环所有变量以获得结果。当然,它本身没有问题,但是迭代多个变量将占用所有的内存(这就是我所经历的)。

代码语言:javascript
运行
复制
# 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")
}

寻求帮助

在多个variables?

  • Is上获得gam结果有更好的方法吗?在implementation?

期间,有一种不超过内存限制的方法

你能帮我一下data.table,purrr用户吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-02-20 19:01:03

我创建的解决方案只将最新的预测保存在内存中,并在用下一个解决方案覆盖它之前将其他预测保存到磁盘中。这些文件是以模型的列名命名的,该文件夹名为结果。我还融化了data.table,主要是因为我认为这样的代码更清晰一些。

代码语言:javascript
运行
复制
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)


# melt the data.table
df <- melt.data.table(df, id.vars = c('X', 'Y'))

dir.create('results')
gam1 <- list()
for(i in unique(df$variable)){

  gam1[[i]] <- gam(value ~ s(X,Y, k=20), data = df[variable == i])

  GAM_poll <- data.table(expand.grid(X = seq(min(df$X), max(df$X), length=200),
                                     Y = seq(min(df$Y), max(df$Y), length=200)))


  GAM_poll[, 'prediction' := predict(gam1[[i]], GAM_poll, type = "response")]

  write.csv(GAM_poll$prediction, paste('results/model_', i, '.csv'), row.names = FALSE)

}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60323717

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档