使用sapply函数改写for循环并绘制迟滞温度与污染物效应图

文章介绍了如何在R语言中用sapply函数替代for循环进行数据分析,具体是针对美国芝加哥的大气污染与死亡数据,研究温度迟滞对死亡率的影响。首先展示了传统的for循环实现,然后用sapply函数进行优化,两者生成的结果一致,但在处理大数据时,sapply由于使用C++编译,运行速度更快。
摘要由CSDN通过智能技术生成

For循环应该是我们在R语言使用得最普遍的循环了,优势就是简单、易上手,缺点就是慢,特别对于跑数据量比较大的数据。Apply家族函数使用C++来编写,运行得非常快,非常适合代替for循环。今天介绍一下sapply函数改写for循环并绘制迟滞温度与污染物效应图。
我们先导入数据和R包

library(mgcv)
library(splines)
library(tsModel)
bc<-read.csv("E:/r/test/chicago.csv",sep=',',header=TRUE)

在这里插入图片描述
这是美国芝加哥1987年至 2000年大气污染与死亡数据(公众号回复:芝加哥2,可以获得数据),我们先来看看数据的构成,death:死亡人数 (per day),pm10:大气污染物pm10的中位数值,pm25median,o3median:二氧化硫的中位数值,time:天数,这里就是我们的时间,tmpd:华氏温度,date:日期
假设我们研究温度的迟滞和死亡率关系,研究2周内的迟滞关系,需要写个循环
先生成一个向量和一个空值,等下跑循环用

maxlag <- 0:13
b<-NULL
for (i in maxlag) {
  fit <- glm(death~pm10 + Lag(temp,seq(0, i)), data = bc, family = poisson)
  summ <- summary(fit)
  summ.coef <- summ$coefficients["pm10",2]
  c(coef(fit)["pm10"], summ.coef)
  a<-rbind(coef(fit)["pm10"],summ.coef)
  b<-cbind(b,a)
}
models<-b

在这里插入图片描述
这样就把2周的温度迟滞对死亡率的影响的数据跑出来了,我们画个图

rng <- range(models[1, ] - 1.96*models[2,], models[1, ] + 1.96*models[2,], 0)
par(mar = c(4, 5, 1, 1))
plot(maxlag, models[1, ], type = "b",pch = 20, ylim = rng, xlab = "Maximum temperature lag",
     ylab = expression(hat(beta)*" for "* PM[10]*" at lag 1"))
lines(maxlag, models[1, ] + 1.96*models[2, ], lty = 2)
lines(maxlag, models[1, ] - 1.96*models[2,], lty = 2)
abline(h = 0, lty = 3)

在这里插入图片描述
这样,温度迟滞对死亡率关系的影响曲线就出来了。下面我们通过sapply函数来改写这个for循环
先要写一个程序来解释一下这个for循环

function(mlag) {
  fit <- glm(death~pm10 + Lag(temp,seq(0, mlag)), data = bc, family = poisson)
  summ <- summary(fit)
  summ.coef <- summ$coefficients["pm10",2]
  c(coef(fit)["pm10"], summ.coef)
  }

写好以后使用sapply函数把它包起来就可以了

models <- sapply(maxlag, function(mlag) {
  fit <- glm(death~pm10 + Lag(temp,seq(0, mlag)), data = bc, family = poisson)
  summ <- summary(fit)
  summ.coef <- summ$coefficients["pm10",2]
  c(coef(fit)["pm10"], summ.coef)
  })

两个循环生成的models函数一模一样
在这里插入图片描述
最后绘图也是一样的,我这个数据小,看不出来差别,大型数据跑起来明显不一样的。
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

天桥下的卖艺者

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值