For ループは、R 言語で使用する最も一般的なループです。利点はシンプルで使いやすいことですが、欠点は、特に比較的大量のデータを含むデータを実行する場合に遅いことです。apply ファミリ関数は C++ で書かれており、非常に高速に実行され、for ループの置き換えに非常に適しています。今日はforループを書き換えてヒステリシス温度と汚染物質の影響図を描くsapply関数を紹介します。
まずデータと R パッケージをインポートします
library(mgcv)
library(splines)
library(tsModel)
bc<-read.csv("E:/r/test/chicago.csv",sep=',',header=TRUE)
こちらは1987年から2000年までのアメリカ・シカゴの大気汚染と死亡者数のデータです(公式アカウントからの返信:シカゴ2、データが取得可能です)、まずはデータの構成を見てみましょう、死亡:死亡者数(あたり) day)、pm10: 大気汚染物質 pm10 の中央値、pm25median、o3median: 二酸化硫黄の中央値、time: 日数、これが現在の時刻、tmpd: 華氏温度、date: 日付温度差と死亡率を 2 週間以内に調査
ヒステリシス関係、ループを記述する必要があります
最初にベクトルと null 値を生成し、後でループを実行します
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)
})
2 つのループによって生成されたモデル関数はまったく同じです
。最終的な描画も同じです。データが小さいため、違いがわかりません。大規模なデータは明らかに動作が異なります。