R中的回归模拟

时间:2014-11-20 23:47:04

标签: r

我正在尝试为以下回归进行10000次模拟以找到H:

日志(TV)= H *日志(M)

其中log(TV)是布朗运动(BM)的总变化的对数,m是x轴上的不相交子区间的大小。因此,通过改变m的大小,我们可以获得电视的新价值,从而获得日志(电视)。对log(m)运行日志(TV)我们可以找到H作为拟合线的斜率。以下是我一直在研究的代码:

t<-0:1000
nsim <- 10000
sig2<-0.01  
#simulate with single BM
x <- rnorm(n = length(t) - 1, sd = sqrt(sig2))
d1<- c(0, cumsum(x))
# calculating total variation
v1<-d1[seq(1,length(d1),1)] # m=1
v2<-d1[seq(1,length(d1),10)] # m=10
v3<-d1[seq(1,length(d1),100)]#m=100
s1<-sum(abs(v1[1:(length(v1)-1)]-v1[2:length(v1)])) 
s2<-sum(abs(v2[1:(length(v2)-1)]-v2[2:length(v2)]))
s3<-sum(abs(v3[1:(length(v3)-1)]-v3[2:length(v3)]))
s<-c(log(s1),log(s2),log(s3))
m<-c(log(1),log(10),log(100))
fit<-lm(s~m)

这有助于我找到H的一个值,现在我想进行10000次模拟,以下是我提出的代码:

for (i in 1:nsim) {X[i, ] <- c(0, cumsum(rnorm(n = length(t) - 1, sd = sqrt(sig2))))}#10000 simulations of BM
# calculating total variation:
v1<-X[,1:1==1]
v2<-X[,1:3==10]
v3<-X[,1:100==100]
a1<-abs(v1[,1:ncol(v1)-1]-v1[,2:ncol(v1)])
a2<-abs(v2[,1:ncol(v2)-1]-v2[,2:ncol(v2)])
a3<-abs(v3[,1:ncol(v3)-1]-v1[,2:ncol(v3)])
s1<-apply(a1,1,sum)
s2<-apply(a2,1,sum)
s3<-apply(a3,1,sum)
s<-cbind(s1,s2,s3)
S<-log(s)
M<-c(log(1),log(10),log(100))

矩阵S是矩阵,其中每行将包含3个对应于m = 1,10,100的log(TV)值。现在我需要使用M运行S中每行的回归,并在每次运行回归时记录H的值。我陷入了这一步。有人可以建议我这样做吗??

非常感谢您提出任何建议

1 个答案:

答案 0 :(得分:2)

说明如何使用原始代码而不是循环中的代码来复制:

Res <- replicate( n= 100, expr = {
t<-0:1000
nsim <- 10000
sig2<-0.01  

x <- rnorm(n = length(t) - 1, sd = sqrt(sig2))
d1<- c(0, cumsum(x))

v1<-d1[seq(1,length(d1),1)] 
v2<-d1[seq(1,length(d1),10)] 
v3<-d1[seq(1,length(d1),100)]
s1<-sum(abs(v1[1:(length(v1)-1)]-v1[2:length(v1)])) 
s2<-sum(abs(v2[1:(length(v2)-1)]-v2[2:length(v2)]))
s3<-sum(abs(v3[1:(length(v3)-1)]-v3[2:length(v3)]))
s<-c(log(s1),log(s2),log(s3))
m<-c(log(1),log(10),log(100))
fit<-lm(s~m); coef(fit) 
   }
  )

> str(Res)
 num [1:2, 1:100] 4.299 -0.526 4.328 -0.506 4.441 ...
 - attr(*, "dimnames")=List of 2
  ..$ : chr [1:2] "(Intercept)" "m"
  ..$ : NULL