我有一个 for 循环,它非常适合(相对)少量重复次数 = 10,100。但是对于“时间”的较大值,我通过填写矩阵得到一个错误:下标超出范围......(参见下面的代码和代码解释)
错误:
Error in M_zp_var[j, (1:n)] : subscript out of bounds
为了填充矩阵,我在第一个中使用了第二个 for 循环
M_zp<-matrix(numeric(1),B,N)
for(j in 1:dim(M_zp)[1]){ M_zp[j,]<-Z_pi(x,y) }
我什至尝试过
M_zp<-t(replicate(B, Z_pi(x,y)))
相反,但它也不起作用。
正如我所说,如果我的外部循环很小,代码就可以工作。我不明白如果我选择更大的“倍”变量(1000、5000),为什么它的工作方式会有所不同。
我知道“下标越界”的意思
我希望你能帮助我,我会很高兴的!:(
代码:
T_p<- matrix(numeric(1),times,Bvar)
H0 <- numeric(times)
for(i in 1:times){
# Each loop starts with a new random vector
x<-rnorm(n) #x<- rdist(n,...); #
y<-rnorm(m) #y<- rdist(m,...); #
# Order statstic with T_pi's T(Z(pi))
n<-length(x)
m<-length(y)
N<-n+m
#Permutate (x,y) B times
**M_zp<-matrix(numeric(1),B,N)
for(j in 1:dim(M_zp)[1]){ M_zp[j,]<-Z_pi(x,y) }** #see below for Z_pi() funct.
#M_zp<-t(replicate(B, Z_pi(x,y)))
M_zp_var<-unique(M_zp)
Bf<-dim(unique(M_zp))[1]
#Test statistic computation for each one of the Permutations in M_zp_var
T_pvec<-numeric(Bvar)
for(j in 1:Bvar){
xp<-M_zp_var[j,(1:n)]
yp<-M_zp_var[j,((n+1):(n+m))]
m_xp<- mstern(xp)
m_yp<- mstern(yp)
T_pvec[j]<-(sd(xp)-sd(yp))/sqrt(m_xp/n+m_yp/m)
}
T_p[i,]<-sort(T_pvec)
}
Z_pi<-function(x,y){
n<-length(x)
m<-length(y)
x<-sort(x)
y<-sort(y)
wicy<-function(s){ wi<-which(y==s); return(wi)}
wicx<-function(s){ wi<-which(x==s); return(wi)}
r<-sample(1:min(n,m),1) #interger beween 1 and min(m+n) = length of entries to interchange between x and y
zwy<-sample(y,r) #vector of length r out of entries in y (randomly) =intries to interchange with x
wy<-unlist(lapply(zwy,wicy))
zwx<-sample(x,r)
wx<-unlist(lapply(zwx,wicx))
yp<-y
xp<-x
yp[wy]<-zwx
xp[wx]<-zwy
zp<-c(sort(xp), sort(yp))
return(zp)
}
解释:
该循环模拟“次”-次排列测试(蒙特卡洛)。一个循环生成 2 个随机样本,然后将它们随机排列 B=16000 次(使用函数进行排列Z_pi()
),然后只采用不同的排列 ( unique()
) 并且从每个排列中计算一个测试统计量......代码停止在涉及功能的标记行(粗体)工作Z_pi()
。