1

ここの例に基づいてローリング回帰関数を作成しようとしていますが、予測値を返すことに加えて、いくつかのローリングモデル診断(つまり、係数、t値、およびmabye R ^ 2)を返したいと思います。結果の種類に基づいて、個別のオブジェクトで結果を返したいのですが。上記のリンクで提供されている例は、ローリング予測を正常に作成しますが、ローリングモデルの診断をパッケージ化して書き出すための支援が必要です。

最後に、関数が3つのオブジェクトを返すようにします。

  1. 予測
  2. 係数
  3. T値
  4. R ^ 2

以下はコードです:

require(zoo)
require(dynlm)

## Create Some Dummy Data
set.seed(12345)
x <- rnorm(mean=3,sd=2,100)
y <- rep(NA,100)
y[1] <- x[1]
for(i in 2:100) y[i]=1+x[i-1]+0.5*y[i-1]+rnorm(1,0,0.5)
int <- 1:100
dummydata <- data.frame(int=int,x=x,y=y)
zoodata <- as.zoo(dummydata)


rolling.regression <- function(series) {
  mod <- dynlm(formula = y ~ L(y) + L(x), data = as.zoo(series)) # get model

  nextOb <- max(series[,'int'])+1 # To get the first row that follows the window
  if (nextOb<=nrow(zoodata)) {   # You won't predict the last one

    # 1) Make Predictions
    predicted <- predict(mod,newdata=data.frame(x=zoodata[nextOb,'x'],y=zoodata[nextOb,'y']))
    attributes(predicted) <- NULL
    c(predicted=predicted,square.res <-(predicted-zoodata[nextOb,'y'])^2)

    # 2) Extract coefficients
    #coefficients <- coef(mod)

    # 3) Extract rolling coefficient t values
    #tvalues <- ????(mod)

    # 4) Extract rolling R^2
    #rsq <-


  }
}    

rolling.window <- 20
results.z <-  rollapply(zoodata, width=rolling.window, FUN=rolling.regression, by.column=F, align='right')

それで、モデル(つまりmod)からt値を抽出する方法を理解した後、関数が3つの別々のオブジェクト(つまり、予測、係数、およびT値)を返すようにするにはどうすればよいですか?

私はRにかなり慣れておらず、関数に本当に慣れておらず、動物園に非常に慣れていません。

どんな援助でも大歓迎です。

4

1 に答える 1

2

正しく理解できたと思いますが、関数を少し編集したものを次に示します。

rolling.regression <- function(series) {
  mod <- dynlm(formula = y ~ L(y) + L(x), data = as.zoo(series)) # get model

  nextOb <- max(series[,'int'])+1 # To get the first row that follows the window
  if (nextOb<=nrow(zoodata)) {   # You won't predict the last one
    # 1) Make Predictions
    predicted=predict(mod,newdata=data.frame(x=zoodata[nextOb,'x'],y=zoodata[nextOb,'y']))
    attributes(predicted)<-NULL
    #Solution 1; Quicker to write
    #     c(predicted=predicted, 
    #       square.res=(predicted-zoodata[nextOb,'y'])^2,
    #       summary(mod)$coef[, 1],
    #       summary(mod)$coef[, 3],
    #       AdjR = summary(mod)$adj.r.squared)

    #Solution 2; Get column names right
    c(predicted=predicted, 
      square.res=(predicted-zoodata[nextOb,'y'])^2,
      coef_intercept = summary(mod)$coef[1, 1],
      coef_Ly = summary(mod)$coef[2, 1],
      coef_Lx = summary(mod)$coef[3, 1],
      tValue_intercept = summary(mod)$coef[1, 3],
      tValue_Ly = summary(mod)$coef[2, 3],
      tValue_Lx = summary(mod)$coef[3, 3],
      AdjR = summary(mod)$adj.r.squared)
  }
}



rolling.window <- 20
results.z <-  rollapply(zoodata, width=rolling.window, FUN=rolling.regression, by.column=F, align='right')

    head(results.z)
   predicted square.res coef_intercept   coef_Ly  coef_Lx tValue_intercept tValue_Ly tValue_Lx      AdjR
20 10.849344   0.721452     0.26596465 0.5798046 1.049594       0.38309211  7.977627  13.59831 0.9140886
21 12.978791   2.713053     0.26262820 0.5796883 1.039882       0.37741499  7.993014  13.80632 0.9190757
22  9.814676  11.719999     0.08050796 0.5964808 1.073941       0.12523824  8.888657  15.01353 0.9340732
23  5.616781  15.013297     0.05084124 0.5984748 1.077133       0.08964998  9.881614  16.48967 0.9509550
24  3.763645   6.976454     0.26466039 0.5788949 1.068493       0.51810115 11.558724  17.22875 0.9542983
25  9.433157  31.772658     0.38577698 0.5812665 1.034862       0.70969330 10.728395  16.88175 0.9511061

それがどのように機能するかを確認するには、回帰を含む小さな例を作成します。

x <- rnorm(1000); y <- 2*x + rnorm(1000)
reg <- lm(y ~ x)
summary(reg)$coef
              Estimate Std. Error    t value Pr(>|t|)
(Intercept) 0.02694322 0.03035502  0.8876033 0.374968
x           1.97572544 0.03177346 62.1816310 0.000000

ご覧のとおり、summary最初に呼び出してからその係数を取得すると (coef(summary(reg))同様に機能します)、推定値、標準誤差、および t 値を含むテーブルが得られます。したがって、推定値はそのテーブルの列 1 に保存され、t 値は列 3 に保存されます。これが、更新されたrolling.regression関数でそれらを取得する方法です。

編集

ソリューションを更新しました。現在は、調整済みの R2 も含まれています。通常の R2 だけが必要な場合は、.adj.

編集2

列に名前を付ける方法をすばやく汚いハックします。

rolling.regression <- function(series) {
  mod <- dynlm(formula = y ~ L(y) + L(x), data = as.zoo(series)) # get model

  nextOb <- max(series[,'int'])+1 # To get the first row that follows the window
  if (nextOb<=nrow(zoodata)) {   # You won't predict the last one
    # 1) Make Predictions
    predicted=predict(mod,newdata=data.frame(x=zoodata[nextOb,'x'],y=zoodata[nextOb,'y']))
    attributes(predicted)<-NULL
    #Get variable names
    strVar <- c("Intercept", paste0("L", 1:(nrow(summary(mod)$coef)-1)))
    vec <- c(predicted=predicted, 
             square.res=(predicted-zoodata[nextOb,'y'])^2,
             AdjR = summary(mod)$adj.r.squared,
             summary(mod)$coef[, 1],
             summary(mod)$coef[, 3])
    names(vec)[4:length(vec)] <- c(paste0("Coef_", strVar), paste0("tValue_", strVar))

    vec
  }
}
于 2013-02-06T17:04:50.490 に答える