ラベル R の投稿を表示しています。 すべての投稿を表示
ラベル R の投稿を表示しています。 すべての投稿を表示

2013年2月14日木曜日

2013年2月3日日曜日

Rでout-of-sampleテスト(ローリング)

http://agecon.ucdavis.edu/graduate-program/class-websites/class/cid_426/inflation.1.do
をRに翻訳したもの

rm(list=ls(all=TRUE))

library(foreign)
library(dynlm)
library(sandwich)

phdata <- read.dta("inflation.dta")

phdata <- ts(phdata,freq=12,start=c(1959,1))

ln.cpiaucns <- log(phdata[,"cpiaucns"])
inf1 <- 1200*diff(ln.cpiaucns)
inf12 <- 100*diff(ln.cpiaucns,lag=12)

yvar <- inf12-lag(inf1,-12)

ln.indpro <- log(phdata[,"indpro"])
ip=1200*diff(ln.indpro)

ln.m2ns <- log(phdata[,"m2ns"])
m2 <- diff(ln.m2ns)

ln.ppicrm <- log(phdata[,"ppicrm"])
comm <- diff(ln.ppicrm)

ys <- phdata[,"gs10"] - phdata[,"tb3ms"]

unrate <- phdata[,"unrate"]

plot(ts.union(yvar,ip,m2,comm,ys,unrate))


# some basic regressions
reg1 <- dynlm(yvar~diff(lag(inf1,-12))+lag(unrate,-12),start=c(1960,1),end=c(1969,12))
summary(reg1)

reg2 <- dynlm(yvar~diff(lag(inf1,-12)),start=c(1960,1),end=c(1969,12))
summary(reg2)


# generate forecasts from first model
yhat <- NULL
e_beg <- c(1960,1)
e_end <- c(1969,12)
for (i in 1:(length(inf12)-12*10+1)) {
    reg <- dynlm(yvar~diff(lag(inf1,-12))+lag(unrate,-12),start=e_beg,end=e_end)
    yhat[i] <- tail(predict(reg),1)
    e_beg <- e_beg + c(0,1)
    e_end <- e_end + c(0,1)
}
yhat <- ts(yhat,freq=12,start=c(1970,12))
f_unemp <- yhat+lag(inf1,-12)


# generate forecasts from second model
yhat <- NULL
e_beg <- c(1960,1)
e_end <- c(1969,12)
for (i in 1:(length(inf12)-12*10+1)) {
    reg <- dynlm(yvar~diff(lag(inf1,-12)),start=e_beg,end=e_end)
    yhat[i] <- tail(predict(reg),1)
    e_beg <- e_beg + c(0,1)
    e_end <- e_end + c(0,1)
}
yhat <- ts(yhat,freq=12,start=c(1970,12))
f_linf <- yhat+lag(inf1,-12)
rm(yhat)


# forecast evaluation
e_unemp <- inf12 - f_unemp
e_linf <- inf12 - f_linf
e2 <- e_unemp^2 - e_linf^2

res_all <- dynlm(e2~1,start=c(1970,12),end=c(2011,8))
summary(res_all)
NeweyWest(res_all,lag=12)

res_7083 <- dynlm(e2~1,start=c(1970,12),end=c(1983,12))
summary(res_7083)
NeweyWest(res_7083,lag=12)

res_8498 <- dynlm(e2~1,start=c(1984,1),end=c(1998,12))
summary(res_8498)
NeweyWest(res_8498,lag=12)

res_9911 <- dynlm(e2~1,start=c(1999,1),end=c(2011,8))
summary(res_9911)
NeweyWest(res_9911,lag=12)

Rのhead()とtail()

head(,n=)
ベクトル、行列の最初からn個(n行)抜き出す

tail(,n=)
ベクトル、行列の最後からn個(n行)抜き出す

# 行列の例
> x<-matrix(1:100,nrow=10,ncol=10)
> x
      [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
 [1,]    1   11   21   31   41   51   61   71   81    91
 [2,]    2   12   22   32   42   52   62   72   82    92
 [3,]    3   13   23   33   43   53   63   73   83    93
 [4,]    4   14   24   34   44   54   64   74   84    94
 [5,]    5   15   25   35   45   55   65   75   85    95
 [6,]    6   16   26   36   46   56   66   76   86    96
 [7,]    7   17   27   37   47   57   67   77   87    97
 [8,]    8   18   28   38   48   58   68   78   88    98
 [9,]    9   19   29   39   49   59   69   79   89    99
[10,]   10   20   30   40   50   60   70   80   90   100
> head(x)
     [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
[1,]    1   11   21   31   41   51   61   71   81    91
[2,]    2   12   22   32   42   52   62   72   82    92
[3,]    3   13   23   33   43   53   63   73   83    93
[4,]    4   14   24   34   44   54   64   74   84    94
[5,]    5   15   25   35   45   55   65   75   85    95
[6,]    6   16   26   36   46   56   66   76   86    96
> head(x,n=1)
     [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
[1,]    1   11   21   31   41   51   61   71   81    91
> head(x,n=2)
     [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
[1,]    1   11   21   31   41   51   61   71   81    91
[2,]    2   12   22   32   42   52   62   72   82    92
> tail(x)
      [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
[5,]     5   15   25   35   45   55   65   75   85    95
[6,]     6   16   26   36   46   56   66   76   86    96
[7,]     7   17   27   37   47   57   67   77   87    97
[8,]     8   18   28   38   48   58   68   78   88    98
[9,]     9   19   29   39   49   59   69   79   89    99
[10,]   10   20   30   40   50   60   70   80   90   100
> tail(x,n=1)
      [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
[10,]   10   20   30   40   50   60   70   80   90   100
> tail(x,n=2)
      [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
[9,]     9   19   29   39   49   59   69   79   89    99
[10,]   10   20   30   40   50   60   70   80   90   100




 # ベクトルの例
 > y<-c(1:10)
> y
 [1]  1  2  3  4  5  6  7  8  9 10
> head(y)
[1] 1 2 3 4 5 6
> head(y,n=1)
[1] 1
> head(y,n=2)
[1] 1 2
> tail(y,n=1)
[1] 10
> tail(y,n=2)
[1]  9 10

Rのset.seed()

同じ乱数を得る

> set.seed(1)
> runif(5) #A
[1] 0.2655087 0.3721239 0.5728534 0.9082078 0.2016819

> set.seed(2)
> runif(5)    #B
[1] 0.1848823 0.7023740 0.5733263 0.1680519 0.9438393

> set.seed(2)
> runif(5)    #C
[1] 0.1848823 0.7023740 0.5733263 0.1680519 0.9438393

> set.seed(1)
> runif(5)    #D
[1] 0.2655087 0.3721239 0.5728534 0.9082078 0.2016819

AとDは同じ、BとCも同じ。

Rのtsオブジェクト

https://sites.google.com/site/leihcrev/r/timeseries

ts(mts)は基本的に各列にそれぞれの名前がついている行列のデータ。

例:

> library(datasets)
> EuStockMarkets
Time Series:
Start = c(1991, 130)
End = c(1998, 169)
Frequency = 260
             DAX    SMI    CAC   FTSE
1991.496 1628.75 1678.1 1772.8 2443.6
1991.500 1613.63 1688.5 1750.5 2460.2
1991.504 1606.51 1678.6 1718.0 2448.2
1991.508 1621.04 1684.1 1708.1 2470.4
1991.512 1618.16 1686.6 1723.1 2484.7
1991.515 1610.61 1671.6 1714.3 2466.8
1991.519 1630.75 1682.9 1734.5 2487.9
1991.523 1640.17 1703.6 1757.4 2508.4
1991.527 1635.47 1697.5 1754.0 2510.5
1991.531 1645.89 1716.3 1754.3 2497.4
1991.535 1647.84 1723.8 1759.8 2532.5
1991.538 1638.35 1730.5 1755.5 2556.8
 ...

 > str(EuStockMarkets)
 mts [1:1860, 1:4] 1629 1614 1607 1621 1618 ...
 - attr(*, "dimnames")=List of 2
  ..$ : NULL
  ..$ : chr [1:4] "DAX" "SMI" "CAC" "FTSE"
 - attr(*, "tsp")= num [1:3] 1991 1999 260
 - attr(*, "class")= chr [1:2] "mts" "ts"

> EuStockMarkets[3,1]
    DAX
1606.51

> EuStockMarkets[,"DAX"]
Time Series:
Start = c(1991, 130)
End = c(1998, 169)
Frequency = 260
   [1] 1628.75 1613.63 1606.51 1621.04 1618.16 1610.61 1630.75 1640.17
   [9] 1635.47 1645.89 1647.84 1638.35 1629.93 1621.49 1624.74 1627.63
  [17] 1631.99 1621.18 1613.42 1604.95 1605.75 1616.67 1619.29 1620.49
  [25] 1619.67 1623.07 1613.98 1631.87 1630.37 1633.47 1626.55 1650.43
  [33] 1650.06 1654.11 1653.60 1501.82 1524.28 1603.65 1622.49 1636.68
  [41] 1652.10 1645.81 1650.36 1651.55 1649.88 1653.52 1657.51 1649.55
...

Rで行列の行と列に名前をつける

> x<-matrix(1:9,nrow=3,ncol=3)
> x
     [,1] [,2] [,3]
[1,]    1    4    7
[2,]    2    5    8
[3,]    3    6    9
> str(x)
 int [1:3, 1:3] 1 2 3 4 5 6 7 8 9



> keys <- c("English","Math","Science")
> str(keys)
 chr [1:3] "English" "Math" "Science"

> colnames(x) <- keys
> str(x)
 int [1:3, 1:3] 1 2 3 4 5 6 7 8 9
 - attr(*, "dimnames")=List of 2
  ..$ : NULL
  ..$ : chr [1:3] "English" "Math" "Science"

> keys2 <- c("a","b","c")
> rownames(x) <-keys2
> x
  English Math Science
a       1    4       7
b       2    5       8
c       3    6       9
> str(x)
 int [1:3, 1:3] 1 2 3 4 5 6 7 8 9
 - attr(*, "dimnames")=List of 2
  ..$ : chr [1:3] "a" "b" "c"
  ..$ : chr [1:3] "English" "Math" "Science"

> x[1]
[1] 1

> x[[1]]
[1] 1

> x[,1]
a b c
1 2 3

> x["a"]
[1] NA

> x[1,"English"]
[1] 1

> x[,"English"]
a b c
1 2 3

# names()だと各要素に名前をつける
> names(x) <- keys
> x
  English Math Science
a       1    4       7
b       2    5       8
c       3    6       9
attr(,"names")
[1] "English" "Math"    "Science" NA        NA        NA        NA      
[8] NA        NA 
     
> str(x)
 int [1:3, 1:3] 1 2 3 4 5 6 7 8 9
 - attr(*, "dimnames")=List of 2
  ..$ : chr [1:3] "a" "b" "c"
  ..$ : chr [1:3] "English" "Math" "Science"
 - attr(*, "names")= chr [1:9] "English" "Math" "Science" NA ...

http://cse.naro.affrc.go.jp/takezawa/r-tips/r/26.html

RでRecall()の使い方(再帰関数)

再帰関数は、

> myfunc <- function(x) {
+   if (x == 1)
+     1
+   else
+     x * myfunc(x - 1)
+ }
> myfunc(5)

[1] 120

とも書けるが、名前を変えてしまうと動かない。

> yourfunc <- myfunc
> rm(myfunc)
> yourfunc(6)
 以下にエラー yourfunc(6) :  関数 "myfunc" を見つけることができませんでした

Recall()を使うと名前を変えても動く。

> myfunc <- function(x) {
+   if (x == 1)
+     1
+   else
+     x * Recall(x - 1)
+ }
> myfunc(6)
[1] 720
> yourfunc <- myfunc
> rm(myfunc)
> yourfunc(6)
[1] 720

http://ofmind.net/doc/r-intro-lecture

Rでfunction()の使い方(引数のデフォルト設定)

> plus <- function(x, y = 1) { x + y }
> plus(10, 20)
[1] 30
> plus(10)
[1] 11

> myfunc <- function(x = 0, y, z=10) {
+   x <- x * 2
+   (x + y) * z
+ }
> myfunc(10,20)
[1] 400
> myfunc(10)
 以下にエラー x + y :  'y'が見つかりません
> myfunc(y=10)
[1] 100

http://ofmind.net/doc/r-intro-lecture

Rでdtaデータ(stata)ファイルの読み込み

library(foreign)

read.dta("filename.dta")

http://www.biwako.shiga-u.ac.jp/sensei/kumazawa/R/readdata.html

2013年1月29日火曜日

Rで行列の最大値を呼び出す

> x<-matrix(1:9,nrow=3,ncol=3)
> x
     [,1] [,2] [,3]
[1,]    1    4    7
[2,]    2    5    8
[3,]    3    6    9
> max(x) #行列全要素の最大値
[1] 9
> max(x[1,]) #行列1行目の最大値
[1] 7
> max(x[,1]) #行列1列目の最大値
[1] 3

行列がNAを含む場合は
max( , na.rm=TRUE)
とする

Rで線形回帰lm()の結果の中身

残差とか理論値とか

http://kasuya.ecology1.org/stats/res_lm01.html

Rでコメントアウト複数行

if(0){
コメント
}

Rでデータフレームに列を加える

> x <- data.frame(a=1:3, b=letters[1:3])
> x["c"] <- c(TRUE,TRUE,FALSE)
> x
  a b     c
1 1 a  TRUE
2 2 b  TRUE
3 3 c FALSE
 
http://www.okada.jp.org/RWiki/?%A5%C7%A1%BC%A5%BF%A5%D5%A5%EC%A1%BC%A5%E0Tips%C2%E7%C1%B4#bae7f71f 

Rで回帰残差にNAを含める方法

> D<-data.frame(x=c(NA,2,3,4,5,6),y=c(2.1,3.2,4.9,5,6,7),residual=NA)
> Z<-lm(y~x,data=D)
> D[names(Z$residuals),"residual"]<-Z$residuals
> D
   x   y residual
1 NA 2.1       NA
2  2 3.2    -0.28
3  3 4.9     0.55
4  4 5.0    -0.22
5  5 6.0    -0.09
6  6 7.0     0.04

http://stackoverflow.com/questions/6882709/how-do-i-deal-with-nas-in-residuals-in-a-regression-in-r

RでデータフレームからNAを含む行を落とす

Data <- na.omit(Data)

Rのデータフレーム

"統計の関数を利用してデータ解析するには,

Rで使用するデータは「データフレーム」の形式
でなければならない."


http://133.100.216.71/R_analysis/basic_data_frame00.html