在R中组合3个不同的矩阵图

时间:2014-10-09 16:36:19

标签: r matrix plot

任何人都可以告诉我如何创建一个包含3种不同矩阵数据集的图。一般来说,我有3个不同的数据矩阵,所有1 * 1001维度,我希望在同一个图表上绘制所有3个。

我设法让一个矩阵一次绘制,并组装代码以创建其他2个矩阵但不绘制它。 B [i,]是随机生成的数据。我想知道的是在一张图上将所有3个图组合在一起的编码。

一个矩阵的代码:     n时间< -1000     average.price.at.each.timestep< - 矩阵(0,nrow = 1,NcoI位= n时间+ 1)

for(i in 1:(ntime+1)){
average.price.at.each.timestep[i]<-mean(B[i,])
}

matplot(t, t(average.price.at.each.timestep), type="l", lty=1, main="MC Price of a Zero Coupon Bond", ylab="Price", xlab = "Option Exercise Date") 

3代码:

average.price.at.each.timestep<-matrix(0,nrow=1,ncol=ntime+1)
s.e.at.each.time <-matrix(0,nrow=1,ncol=ntime+1)
upper.c.l.at <- matrix(0,nrow=1,ncol=ntime+1)
lower.c.l.at <- matrix(0,nrow=1,ncol=ntime+1)
std <- function(x) sd(x)/sqrt(length(x))

for(i in 1:(ntime+1)){
average.price.at.each.timestep[i]<-mean(B[i,])
s.e.at.each.time[i] <- std(B[i,])
upper.c.l.at[i] <- average.price.at.each.timestep[i]+1.96*s.e.at.each.time[i]
lower.c.l.at[i] <- average.price.at.each.timestep[i]-1.96*s.e.at.each.time[i]
}

由于无法获得与我的数据集匹配的解决方案,我仍然在努力解决这个问题,我现在已经包含了生成矩阵B作​​为工作示例的下面的代码,因此您可以看到我的数据处理。你可以看到它产生了不同价格的图,我想要一个平均价格和平均值的置信区间的图。

# Define Bond Price Parameters
#
P<-1                            #par value

# Define Vasicek Model Parameters
#
rev.rate<-0.3                   #speed of reversion
long.term.mean<-0.1             #long term level of the mean
sigma<-0.05                  #volatility
r0<-0.03                            #spot interest rate
Strike<-0.05
# Define Simulation Parameters
#
T<-50                           #time to expiry
ntime<-1000                 #number of timesteps
yearstep<-ntime/T               #yearstep
npaths<-1000                    #number of paths
dt<-T/ntime                     #timestep
R <- matrix(0,nrow=ntime+1,ncol=npaths) #matrix of Vasicek interest rate values
B <- matrix(0,nrow=ntime+1,ncol=npaths) # matrix of Bond Prices 

R[1,]<-r0                   #specifies that all paths start at specified spot rate
B[1,]<-P

# do loop which generates values to fill matrix R with multiple paths of Interest Rates as they evolve over time.
# stochastic process based on standard normal distribution

for (j in 1:npaths) {
 for (i in 1:ntime) {
   dZ <-rnorm(1,mean=0,sd=1)*sqrt(dt)
   Rij<-R[i,j]
   Bij<-B[i,j]
   dr <-rev.rate*(long.term.mean-Rij)*dt+sigma*dZ
   R[i+1,j]<-Rij+dr
   B[i+1,j]<-Bij*exp(-R[i+1,j]*dt)   
  }
} 

t<-seq(0,T,dt)
par(mfcol = c(3,3))


matplot(t, B[,1:pmin(20,npaths)], type="l", lty=1, main="Price of a Zero Coupon Bond", ylab="Price", xlab = "Time to Expiry") 

3 个答案:

答案 0 :(得分:0)

你的例子是不可复制的,所以我创建了一些假的数据,我希望它与你的结构类似。如果这不是你想要的,请告诉我,我会根据需要更新。

# Fake data
ntime <- 100 
mat1 <- matrix(rnorm(ntime+1, 10, 2), nrow=1, ncol=ntime+1)
mat2 <- matrix(rnorm(ntime+1, 20, 2), nrow=1, ncol=ntime+1)
mat3 <- matrix(rnorm(ntime+1, 30, 2), nrow=1, ncol=ntime+1)

matplot(1:(ntime+1), t(mat1), type="l", lty=1, ylim=c(0, max(c(mat1,mat2,mat3))),
        main="MC Price of a Zero Coupon Bond", 
        ylab="Price", xlab = "Option Exercise Date") 

# Add lines for mat2 and mat3
lines(1:101, mat2, col="red")
lines(1:101, mat3, col="blue")

enter image description here

更新:这是你要做的吗?

matplot(t, t(average.price.at.each.timestep), type="l", lty=1, 
        main="MC Price of a Zero Coupon Bond", ylab="Price", 
        xlab = "Option Exercise Date") 
matlines(t, t(upper.c.l.at), lty=2, col="red")
matlines(t, t(lower.c.l.at), lty=2, col="green")

见下图。如果您要绘制多个列(如在更新的示例中绘制20个单独的路径),并且您想为所有这些列添加较低和较高的CI(尽管这会使绘图不可读),只需使用矩阵与average.price.at.each.timestep中的每个路径对应的上下CI值,并使用matlines将它们添加到多个路径的现有绘图中。

enter image description here

答案 1 :(得分:0)

使用ggplot2reshape2可行。您拥有的结构有点尴尬,您可以通过使用数据框而不是矩阵来改进。

#Dummy data
average.price.at.each.timestep <- rnorm(1000, sd=0.01)
s.e.at.each.time <- rnorm(1000, sd=0.0005, mean=1)

#CIs (note you can vectorise this):
upper.c.l.at <- average.price.at.each.timestep+1.96*s.e.at.each.time
lower.c.l.at <- average.price.at.each.timestep-1.96*s.e.at.each.time

#create a data frame:
prices <- data.frame(time = 1:length(average.price.at.each.timestep), price=average.price.at.each.timestep, upperCI= upper.c.l.at, lowerCI= lower.c.l.at)

library(reshape2)
#turn the data frame into time, variable, value triplets
prices.t <- melt(prices, id.vars=c("time"))

#plot
library(ggplot2)
ggplot(prices.t, aes(time, value, colour=variable)) + geom_line()

这会产生以下情节: enter image description here

使用geom_ribbon代替:

可以稍微改善一下
ggplot(prices, aes(time, price)) + geom_ribbon(aes(ymin=lowerCI, ymax=upperCI), alpha=0.1) + geom_line()

产生这个情节:

enter image description here

答案 2 :(得分:0)

这是另一个略有不同的ggplot解决方案,它不需要您首先计算置信区间 - ggplot会为您完成。

# create sample dataset
set.seed(1)   # for reproducible example
B <- matrix(rnorm(1000,mean=rep(10+1:10/2,each=10)),nc=10)

library(ggplot2)
library(reshape2)   # for melt(...)
gg <- melt(data.frame(date=1:nrow(B),B), id="date")
ggplot(gg, aes(x=date,y=value)) + 
  stat_summary(fun.y = mean, geom="line")+
  stat_summary(fun.y = function(y)mean(y)-1.96*sd(y)/sqrt(length(y)), geom="line",linetype="dotted", color="blue")+
  stat_summary(fun.y = function(y)mean(y)+1.96*sd(y)/sqrt(length(y)), geom="line",linetype="dotted", color="blue")+
  theme_bw()

stat_summary(...)总结了给定x值(日期)的y值。因此,在第一次调用中,它计算平均值,第二次调用lowerCL,第三次调用upperCL。

你也可以创建一个CL(...)函数,然后调用:

CL <- function(x,level=0.95,type=c("lower","upper")) {
  fact <- c(lower=-1,upper=1)
  mean(x) - fact[type]*qnorm((1-level)/2)*sd(x)/sqrt(length(x))
}
ggplot(gg, aes(x=date,y=value)) + 
  stat_summary(fun.y = mean, geom="line")+
  stat_summary(fun.y = CL, type="lower", geom="line",linetype="dotted", color="blue")+
  stat_summary(fun.y = CL, type="upper", geom="line",linetype="dotted", color="blue")+
  theme_bw()

这会产生与上面相同的图。