-
Notifications
You must be signed in to change notification settings - Fork 20
/
RBC_R.R
110 lines (74 loc) · 3.18 KB
/
RBC_R.R
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
## RBC code in R
## 0. Housekeeping
rm(list=ls())
ptm <- proc.time()
## 1. Calibration
aalpha = 1/3; # Elasticity of output w.r.t. capital
bbeta = 0.95; # Discount factor
# Productivity values
vProductivity <- c(0.9792, 0.9896, 1.0000, 1.0106, 1.0212);
# Transition matrix
mTransition <- c(0.9727, 0.0273, 0.0000, 0.0000, 0.0000,
0.0041, 0.9806, 0.0153, 0.0000, 0.0000,
0.0000, 0.0082, 0.9837, 0.0082, 0.0000,
0.0000, 0.0000, 0.0153, 0.9806, 0.0041,
0.0000, 0.0000, 0.0000, 0.0273, 0.9727);
mTransition <- matrix(mTransition,nrow=5,ncol=5);
mTransition <- t(mTransition)
## 2. Steady State
capitalSteadyState = (aalpha*bbeta)^(1/(1-aalpha));
outputSteadyState = capitalSteadyState^aalpha;
consumptionSteadyState = outputSteadyState-capitalSteadyState;
cat(" Output = ", outputSteadyState,", Capital = ",capitalSteadyState, ", Consumption = ", consumptionSteadyState,"\n")
cat(" \n")
# We generate the grid of capital
vGridCapital <- seq(0.5*capitalSteadyState, 1.5*capitalSteadyState, by = 0.00001);
nGridCapital <- length(vGridCapital);
nGridProductivity <- length(vProductivity);
# 3. Required matrices and vectors
mOutput <- matrix(0,nGridCapital,nGridProductivity);
mValueFunction <- matrix(0,nGridCapital,nGridProductivity);
mValueFunctionNew <- matrix(0,nGridCapital,nGridProductivity);
mPolicyFunction <- matrix(0,nGridCapital,nGridProductivity);
expectedValueFunction <- matrix(0,nGridCapital,nGridProductivity);
## 4. We pre-build output for each point in the grid
mOutput = as.matrix(vGridCapital^aalpha)%*%t(as.matrix(vProductivity));
## 5. Main iteration
maxDifference <- 10;
tolerance <- 0.0000001;
iteration <- 0;
while (maxDifference>tolerance){
expectedValueFunction = mValueFunction %*% t(mTransition);
for (nProductivity in 1:nGridProductivity){
# We start from previous choice (monotonicity of policy function)
gridCapitalNextPeriod <- 1;
for (nCapital in 1:nGridCapital){
valueHighSoFar <- -100000;
capitalChoice <- vGridCapital[1];
for (nCapitalNextPeriod in gridCapitalNextPeriod:nGridCapital){
consumption <- mOutput[nCapital,nProductivity]-vGridCapital[nCapitalNextPeriod];
valueProvisional <- (1-bbeta)*log(consumption)+bbeta*expectedValueFunction[nCapitalNextPeriod,nProductivity];
if (valueProvisional>valueHighSoFar){
valueHighSoFar <- valueProvisional;
capitalChoice <- vGridCapital[nCapitalNextPeriod];
gridCapitalNextPeriod <- nCapitalNextPeriod;}
else{
break; # We break when we have achieved the max
}
}
mValueFunctionNew[nCapital,nProductivity] <- valueHighSoFar;
mPolicyFunction[nCapital,nProductivity] <- capitalChoice;
}
}
maxDifference <- max(abs(mValueFunctionNew-mValueFunction));
mValueFunction <- mValueFunctionNew;
iteration = iteration+1;
if ((iteration %% 10)==0 | iteration ==1){
cat(" Iteration = ", iteration," Sup Diff = ", maxDifference,"\n");
}
}
cat(" Iteration = ", iteration," Sup Diff = ", maxDifference,"\n");
cat(" \n")
cat(" My chek = ", mPolicyFunction[1000,3],"\n");
cat(" \n")
proc.time() - ptm