楼主: elephann
3919 19

[有偿编程] 编程求助!! [推广有奖]

11
elephann 发表于 2011-7-5 21:50:10
此外,我同事用C帮我编程,也遭遇了这个中间环节巨量数据导致无法继续的情形! 没辙,我这才寻思如何设计一个好的随机抽样方法,最近也在看monte carlo法,还未能领会精髓!:)
独立精神,自由意志!

12
elephann 发表于 2011-7-5 21:50:36
此外,我同事用C帮我编程,也遭遇了这个中间环节巨量数据导致无法继续的情形! 没辙,我这才寻思如何设计一个好的随机抽样方法,最近也在看monte carlo法,还未能领会精髓!:)
独立精神,自由意志!

13
elephann 发表于 2011-7-5 21:50:54
此外,我同事用C帮我编程,也遭遇了这个中间环节巨量数据导致无法继续的情形! 没辙,我这才寻思如何设计一个好的随机抽样方法,最近也在看monte carlo法,还未能领会精髓!:)
独立精神,自由意志!

14
epoh 发表于 2011-7-5 21:52:58
没错,这是满足你的条件的所有组.合
你只要取样就好
为何还要抽样  ??
况且计算完毕之后就要remove
避免你说的问题发生.

15
elephann 发表于 2011-7-5 22:02:20
14# epoh
combn(n,k)可以直接生成各种可能的组合,比如刚才你给出那个用这个函数
> combn(100,2)
     [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] [,11] [,12] [,13]
[1,]    1    1    1    1    1    1    1    1    1     1     1     1     1
[2,]    2    3    4    5    6    7    8    9   10    11    12    13    14
     [,14] [,15] [,16] [,17] [,18] [,19] [,20] [,21] [,22] [,23] [,24] [,25]
[1,]     1     1     1     1     1     1     1     1     1     1     1     1
[2,]    15    16    17    18    19    20    21    22    23    24    25    26
    ............................
   [,4940] [,4941] [,4942] [,4943] [,4944] [,4945] [,4946] [,4947] [,4948]
[1,]      95      96      96      96      96      97      97      97      98
[2,]     100      97      98      99     100      98      99     100      99
     [,4949] [,4950]
[1,]      98      99
[2,]     100     100

但我这儿combn(1347,3)就崩溃了!! 所以,我现在考虑的始终是如何设计一个好的抽样方法! anyway, 非常感谢,朋友!!
独立精神,自由意志!

16
epoh 发表于 2011-7-6 08:15:06
9 楼是因combn()很少用
打了三次?都没弄对
乾脆花30 秒自己编程比较快
还好没出错

了解你的情形,还是回到 4楼
A=seq(1:1374)
x=sample(A,1374,replace = FALSE)
y=sample(A,1374,replace = FALSE)
就用if条件句约束
以满足
  1.避免第一、二个随机数都一样
  2.排除比如n个中有r个相同
  3.排除两个组合都一样
for(j in 1:z){
if(y[j]==x[j] & j==1) y[j]=y[j+1]  
if(y[j]==x[j] & j==z) y[j]=y[j-1]
}
##########
##########
sim=50    #simulation
tev=NA*seq(1:sim)
for(s in 1:sim){
print('s')
print(s)
z=20
yy=0
#prepare data tvwr,tvw,bench
x1=cbind(rnorm(50),rnorm(50),rnorm(50),rnorm(50),rnorm(50))
x2=x1+0.5
x3=x1+1
x4=x1+1.5
tvwr=cbind(x1,x2,x3,x4)
y1=cbind(rnorm(50,1,3),rnorm(50,1,3),rnorm(50,1,3),rnorm(50,1,3),rnorm(50,1,3))
y2=y1+1
y3=y1+1.5
y4=y1+2
tvw=cbind(y1,y2,y3,y4)
bench=cbind(rnorm(50),rnorm(50))

#sampling
A=seq(1:z)
x=sample(A,z,replace = FALSE)
y=sample(A,z,replace = FALSE)
for(j in 1:z){
if(y[j]==x[j] & j==1) y[j]=y[j+1]  #避免第一、二个随机数都一样
if(y[j]==x[j] & j==z) y[j]=y[j-1]    #排除比如n个中有r个相同
                                                #排除两个组合都一样

print(c(x[j],y[j]))                          #列出供查看
}#end j

for(i in 1:z){
yy<-yy+var((tvwr[,x]+tvwr[,y])/(tvw[,x]+tvw[,y])-bench[,1],na.rm=T)
}#end i
print(yy)
tev=yy/(z-1)
}#end s
tev
mean_tev=mean(tev)
mean_tev

17
elephann 发表于 2011-7-7 04:12:46
16# epoh
昨天没有上来,刚才才开始看,见谅啊!by the way,你是学计算机还是数学?感觉你思路灵活,编程也很严谨规范!受益良多!!感激!!
还有点疑问,这怪我前面表述有问题!
我有数据集tvwr和tvw,都是1347个时间序列(二者完全对应,只是类型不同),另有一个基准数据,一个时间序列。
我本计划从1347时间序列中任意取r=1,2,...n(=1347),对每个r考虑所有可能的组合,进而求其平均估计量(var)并验证显著性。但由于计算机计算能力轻易就达到极限,转而考虑抽样(对任意r抽样z个)。
现在问题是:我怎样避免无效(或者说错误抽样),这就是对每个r取出的z个序列,如何避免其中有r(r=1,2,...,z)个序列相同?如果在r=2,z=10000情形下,可表述为
A=seq(1:1347)
x=sample(A,10000,replace = TRUE)
y=sample(A,10000,replace = TRUE)
因为choose(1347,2)=906531,replace = FALSE会有错误。
进而可用
for(j in 1:z)
if(y[j]==x[j] & j==1) y[j]=y[j+1]
if(y[j]==x[j] & j==z) y[j]=y[j-1]
避免x[ i ]、y[ i ] (第一、二个)随机数都一样; z个中有任意两个组合一样。
上面是对r=2,如果:(r=10,z=10000)或(r=800,z=10000),甚至更一般(r=k,z=10000)(k=2,...,1346)抽样部分、判断语句及修正有无好的表述选择?
此外,我的公式yy<-yy+var((tvwr[,x]+tvwr[,y])/(tvw[,x]+tvw[,y])-bench[,1],na.rm=T)是一个很局限的公式(只适用于r=2),var中分子一般化是r个tvwr[,x ]之和,考虑到r可以大到1346,可否有集约化表述?
现在主要问题依然还是抽样及判别修正!
独立精神,自由意志!

18
epoh 发表于 2011-7-7 16:15:39
还需再了解 一下
你的时间序列length多少
也就是dim(tvw)= ?? x 1347

z应该就simulation 次数吧

sim=10000
for(i in 1:sim){
...
}
average=mean(tev)

既然考虑抽样
就应忘掉取样
增加simulation次数
如果稳定的话平均值就很稳
如果不准不稳的话
期权如何定价

19
elephann 发表于 2011-7-7 16:47:40
18# epoh
时间是120 ,120*1347的数据框
独立精神,自由意志!

20
caesarzhang 发表于 2011-7-13 00:47:44
楼主试试:
i <- j <- c(1:1347);  K <- 1e4
mat <- expand.grid(i,j)
set.seed(20); inds <- mat[sample(1:nrow(mat), K),]
yy <- 0
for(i in 1:K) yy <- yy+var((tvwr[,inds[i,1]]+tvwr[,inds[i,2]])/(tvw[,inds[i,1]]+tvw[,inds[i,2]])-bench[,1],na.rm=T)
(tev[2]<-yy/(K-1))

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注cda
拉您进交流群
GMT+8, 2025-12-27 08:27