color <- c("R","B","B","R","R") weight <- c(51,55,72,57,64) dfrm <- data.frame(COL=color, WEI=weight)
dfrm %>% mutate(WEILag = lag(WEI))
メモ:lagを使うと、データは下に1段下がる(1行下がる)。
差分を計算するとき、diff()は使えず、G_delta = G - lag(G)。たとえば以下のようにする。
color <- c("R","B","B","R","R") weight <- c(51,55,72,57,64) dfrm <- data.frame(COL=color, WEI=weight)
dfrm %>% mutate(WEILag = lag(WEI))
メモ:lagを使うと、データは下に1段下がる(1行下がる)。
差分を計算するとき、diff()は使えず、G_delta = G - lag(G)。たとえば以下のようにする。
embedの使い方(自分用のメモ)
Rにはembedという関数があり、ベクトル・時系列を指定期間ずらす作業に使える。言葉で聞くとなんだかわからないと思うので、たとえば以下のような時系列データがあったとする。
使い方は以下のとおり
demoTs <- ts(seq(1:8), start=c(2019,1), freq=4) embed(demoTs, dimension=2)
出力結果は以下のとおり:
「こんな関数、何に使うんだよ?」と思うかもしれない。
たとえば自分で自己回帰モデル(ARやVAR)の関数を書くときに使える。まあ、ARやVARのパッケージはすでにいろいろと充実しているので、自分で書く必要があるかと言われたら、そんな機会はあまりないような気もするが、ときによっては便利な関数である。
以下の記事の続編:
成長率の計算 - ハリ・セルダンになりたくて(はてダから移行中)
少し改訂版を作ったので記録のために以下に(前期比・前年同期比も計算できるように)。
growthRate <- function(tsData, lagLen=1, percent=FALSE)
{
numSize <- length(tsData)
seque <- seq(1:(numSize-lagLen))
if(isTRUE(percent)){
tsGrowth <- (diff(tsData, lag=lagLen)/tsData[seque]) * 100
} else {
tsGrowth <- (diff(tsData, lag=lagLen)/tsData[seque])
}
return(tsGrowth)
}
そもそもlm()(とglm())には「data.frameの列がfactorである場合、自動的にダミー変数を作って、回帰してくれる」という機能がある(manにきちんと書かれてないので知らない人が多いかも)。
が、lmやglmの「自動でダミー変数を作る機能」だと思うようなダミー変数にならない場合もあるので、パッケージでダミー変数を作ることを考える。
いくつかパッケージがあるが、それなりに使いやすいパッケージとしてfastDummiesがあるため、その中のdummy_cols()を使ってダミー変数を作る方法を以下に記す。
require(fastDummies)
require(tidyverse)
when <- data.frame(time = c("afternoon", "night", "afternoon", "morning", "morning", "morning", "morning", "afternoon", "afternoon"), day = c("Mon", "Mon", "Mon", "Wed", "Wed", "Fri", "Sat", "Sat", "Fri"))
when[3, "day"] <- NA
when %>% head()
dummy_cols(when)
# 自分用のメモ:現時のバージョンのfastDummiesではNAはNAのままで各列に入力される(以前は違ったようだが)。
参考(4つのパッケージの比較)
require(openxlsx)
tmpdat<- read.xlsx("./data.xlsx", sheet = 2, startRow = 9, detectDates=TRUE)
head(tmpdat)
wb <- createWorkbook()
addWorksheet(wb, 'Sheet1')
addWorksheet(wb, 'Sheet2')
writeData(wb, sheet = 'Sheet1', x = lm.res1, withFilter=F)
writeData(wb, sheet = 'Sheet2', x = lm.res2, withFilter=F)
saveWorkbook(wb, "lm.res.xlsx", overwrite = T)
以下に改訂版の既述あり。
成長率の計算(改訂版) - ハリ・セルダンになりたくて(はてダから移行中)
Rを使って成長率(%表示)を計算する方法についての備忘録。
前提:tsDataをベクトルもしくはtsオブジェクトとする。
その1:対数差分
diff(log(tsData))*100
メリット:成長率の近似であるが、プログラムが簡単
デメリット:tsData
の要素が正である必要がある(たとえばGDPならOK、在庫変動は[負になることがあるため]ダメ)
その2:定義通りに成長率を計算する
一行で書くと:
numSize <- length(tsData); tsGrowth <- (diff(tsData)/tsData[-numSize]) * 100
関数にするなら以下:
growthRate <- function(tsData)
{
numSize <- length(tsData)
tsGrowth <- (diff(tsData)/tsData[-numSize]) * 100
return(tsGrowth)
}
使い方はこんな感じ。
source("growthRate.R")
tmpTs <- seq(1,10,by=0.3)
growthRate(tmpTs)
自分用の覚書
CRANにあるx13binaryが使えるようになったので、自分でX-13ARIMA-SEATSをコンパイルする必要がなくなり、MacとWinの違いもなくなりました。
[インストール]GNU Rで二つのパッケージをインストール
注:seasonalをインストールするとx13binaryも一緒にインストールされる。
[GNU Rのパッケージseasonalからx13asを実行する]
lines(m$series$s12, col="blue") #トレンド
seasonalの使い方についてvignettesを参照されたい
https://cran.ism.ac.jp/web/packages/seasonal/vignettes/seas.pdf
[注意すべき点]
https://www2.census.gov/software/x-13arima-seats/x13as/unix-linux/documentation/docx13ashtml.pdf
s10: 季節成分(seasonal component)
s11: 季節調整値(seasonal adjustment component)
s12:トレンド成分(trend component)
s13:不規則成分(irregular component)
詳しくは以下のTable 7.31を参照
https://www2.census.gov/software/x-13arima-seats/x13as/unix-linux/documentation/docx13ashtml.pdf
外れ値やレベルシフトの調整にはregression.variablesを使う。使い方は以下のTable 7.28を参照
https://www.census.gov/ts/x13as/docX13AS.pdf