Leyla Biondini
2008-Apr-04 09:58 UTC
[R] Problems with Unit Root testing using ur.df function
Hi All, I'm new to R and am trying to run a unit root test on the vector "y" (a time series of inflation (i.e. changes in the Consumer Price Index quarter on quarter)). I've run the Augmented-Dickey-Fuller Test below (R's URCA package). It gives me an error that it cannot find the function ur.df unless I comment out the third last line of code (see below). I try to call the function via the following: test <- ur.df(y, type = "none", lags = 1) Am I doing this correctly? When I then type in test() it comes back with Error: could not find function "test" When I type in a <- summary(test) It comes back with> aLength Class Mode 1 character character I just want it to provide summary stats of the unit root test (ADF or PP) on the vector y. Thank you for your help, Leyla ## ## Augmented-Dickey-Fuller Test ## ur.df <- function (y, type = c("none", "drift", "trend"), lags = 1) { if (ncol(as.matrix(y)) > 1) stop("\ny is not a vector or univariate time series.\n") if (any(is.na(y))) stop("\nNAs in y.\n") y <- as.vector(y) lag <- as.integer(lags) if (lag < 0) stop("\nLags must be set to an non negative integer value.\n") CALL <- match.call() DNAME <- deparse(substitute(y)) type <- type[1] x.name <- deparse(substitute(y)) lags <- lags + 1 z <- diff(y) n <- length(z) x <- embed(z, lags) z.diff <- x[, 1] z.lag.1 <- y[lags:n] tt <- lags:n if (lags > 1) { z.diff.lag = x[, 2:lags] if (type == "none") { result <- lm(z.diff ~ z.lag.1 - 1 + z.diff.lag) tau <- coef(summary(result))[1, 3] teststat <- as.matrix(tau) colnames(teststat) <- 'tau1' } if (type == "drift") { result <- lm(z.diff ~ z.lag.1 + 1 + z.diff.lag) tau <- coef(summary(result))[2, 3] phi1.reg <- lm(z.diff ~ -1 + z.diff.lag) phi1 <- anova(phi1.reg, result)$F[2] teststat <- as.matrix(t(c(tau, phi1))) colnames(teststat) <- c('tau2', 'phi1') } if (type == "trend") { result <- lm(z.diff ~ z.lag.1 + 1 + tt + z.diff.lag) tau <- coef(summary(result))[2, 3] phi2.reg <- lm(z.diff ~ -1 + z.diff.lag) phi3.reg <- lm(z.diff ~ z.diff.lag) phi2 <- anova(phi2.reg, result)$F[2] phi3 <- anova(phi3.reg, result)$F[2] teststat <- as.matrix(t(c(tau, phi2, phi3))) colnames(teststat) <- c('tau3', 'phi2', 'phi3') } } else { if (type == "none") { result <- lm(z.diff ~ z.lag.1 - 1) tau <- coef(summary(result))[1, 3] teststat <- as.matrix(tau) colnames(teststat) <- 'tau1' } if (type == "drift") { result <- lm(z.diff ~ z.lag.1 + 1) phi1.reg <- lm(z.diff ~ -1) phi1 <- anova(phi1.reg, result)$F[2] tau <- coef(summary(result))[2, 3] teststat <- as.matrix(t(c(tau, phi1))) colnames(teststat) <- c('tau2', 'phi1') } if (type == "trend") { result <- lm(z.diff ~ z.lag.1 + 1 + tt) phi2.reg <- lm(z.diff ~ -1) phi3.reg <- lm(z.diff ~ 1) phi2 <- anova(phi2.reg, result)$F[2] phi3 <- anova(phi3.reg, result)$F[2] tau <- coef(summary(result))[2, 3] teststat <- as.matrix(t(c(tau, phi2, phi3))) colnames(teststat) <- c('tau3', 'phi2', 'phi3') } } rownames(teststat) <- 'statistic' testreg <- summary(result) res <- residuals(testreg) if(n < 25) rowselec <- 1 if(25 <= n & n < 50) rowselec <- 2 if(50 <= n & n < 100) rowselec <- 3 if(100 <= n & n < 250) rowselec <- 4 if(250 <= n & n < 500) rowselec <- 5 if(n >= 500) rowselec <- 6 if (type == "none"){ cval.tau1 <- rbind( c(-2.66, -1.95, -1.60), c(-2.62, -1.95, -1.61), c(-2.60, -1.95, -1.61), c(-2.58, -1.95, -1.62), c(-2.58, -1.95, -1.62), c(-2.58, -1.95, -1.62)) cvals <- t(cval.tau1[rowselec, ]) testnames <- 'tau1' } if (type == "drift"){ cval.tau2 <- rbind( c(-3.75, -3.00, -2.63), c(-3.58, -2.93, -2.60), c(-3.51, -2.89, -2.58), c(-3.46, -2.88, -2.57), c(-3.44, -2.87, -2.57), c(-3.43, -2.86, -2.57)) cval.phi1 <- rbind( c(7.88, 5.18, 4.12), c(7.06, 4.86, 3.94), c(6.70, 4.71, 3.86), c(6.52, 4.63, 3.81), c(6.47, 4.61, 3.79), c(6.43, 4.59, 3.78)) cvals <- rbind( cval.tau2[rowselec, ], cval.phi1[rowselec, ]) testnames <- c('tau2', 'phi1') } if (type == "trend"){ cval.tau3 <- rbind( c(-4.38, -3.60, -3.24), c(-4.15, -3.50, -3.18), c(-4.04, -3.45, -3.15), c(-3.99, -3.43, -3.13), c(-3.98, -3.42, -3.13), c(-3.96, -3.41, -3.12)) cval.phi2 <- rbind( c(8.21, 5.68, 4.67), c(7.02, 5.13, 4.31), c(6.50, 4.88, 4.16), c(6.22, 4.75, 4.07), c(6.15, 4.71, 4.05), c(6.09, 4.68, 4.03)) cval.phi3 <- rbind( c(10.61, 7.24, 5.91), c( 9.31, 6.73, 5.61), c( 8.73, 6.49, 5.47), c( 8.43, 6.49, 5.47), c( 8.34, 6.30, 5.36), c( 8.27, 6.25, 5.34)) cvals <- rbind( cval.tau3[rowselec, ], cval.phi2[rowselec, ], cval.phi3[rowselec, ]) testnames <- c('tau3', 'phi2', 'phi3') } colnames(cvals) <- c("1pct", "5pct", "10pct") rownames(cvals) <- testnames #new("ur.df", y=y, model=type, cval=cvals, lags=lag, teststat=teststat, testreg=testreg, res=res, test.name="Augmented Dickey-FullerTest") } test <- ur.df(y, type = "none", lags = 1)
Matthieu Stigler
2008-Apr-04 12:05 UTC
[R] Problems with Unit Root testing using ur.df function
Matthieu Stigler a ?crit :> Hi All, > > I'm new to R and am trying to run a unit root test on the vector "y" > (a time > series of inflation (i.e. changes in the Consumer Price Index quarter on > quarter)). > I've run the Augmented-Dickey-Fuller Test below (R's URCA package). It > gives > me an error that it cannot find the function ur.df unless I comment > out the > third last line of code (see below). >Note that thes ADf test is the best known and maybe most used unit root test, but sure not the most powerfull. Maddala and Kim (Unit root, cointegration a nd structural break) criticize it and recommend use of other tests, maybe the ERS aslo avalaible in urca> I try to call the function via the following: > > test <- ur.df(y, type = "none", lags = 1) > > Am I doing this correctly? >YES> > When I then type in > > test() > > it comes back with > > Error: could not find function "test" > >If you put parentheses, R thinks it is a function... just let test, or, equal, print(test)> When I type in > a <- summary(test) > > It comes back with >> / a > / Length Class Mode > 1 character character >this is strange... you should have the usual summary... I have on my machine library(urca) test2<-ur.df(nottem, type="none", lags=1) summary(test2) ############################################### # Augmented Dickey-Fuller Test Unit Root Test # ############################################### Test regression none Call: lm(formula = z.diff ~ z.lag.1 - 1 + z.diff.lag) Residuals: Min 1Q Median 3Q Max -12.7479 -2.8589 0.5654 3.7597 12.7562 Coefficients: Estimate Std. Error t value Pr(>|t|) z.lag.1 -0.008473 0.006089 -1.392 0.165 z.diff.lag 0.461745 0.058185 7.936 8.41e-14 *** --- Signif. codes: 0 ?***? 0.001 ?**? 0.01 ?*? 0.05 ?.? 0.1 ? ? 1 Residual standard error: 4.676 on 236 degrees of freedom Multiple R-squared: 0.213, Adjusted R-squared: 0.2063 F-statistic: 31.93 on 2 and 236 DF, p-value: 5.316e-13 Value of test-statistic is: -1.3915 Critical values for test statistics: 1pct 5pct 10pct tau1 -2.58 -1.95 -1.62 dont' you have it? What is this / a?> I just want it to provide summary stats of the unit root test (ADF or > PP) on > the vector y. > > Thank you for your help, > Leyla >