如何修复“下标越界错误”

3

我有一份应用于某个数据X和Y的R代码,这段代码相当简单,但是它会出现某些错误。

"Error in `[<-`(`*tmp*`, R, , value = c(1, 1)) : subscript out of bounds"

有没有人能帮我解决这个问题。

#X <- read.table("data1.dat")
#Y <-read.table("data2.dat")

X <- c(1,2,43,1,6,5,44,6.8,7.8,9.8)
Y <- c(1,3,31,26,78,4,5,44,4,6)

length(X)
length(Y)

Rmax <- 15
data_len <- length(X)
Z <- as.matrix(cbind(X,Y))
Cen <- matrix(rnorm(2*Rmax),Rmax,2)
Xe <- as.matrix(cbind(1,X))
w <-  matrix(rnorm(2*Rmax),Rmax,2)
lambda <- matrix(rnorm(1*Rmax),Rmax,1)
U <- matrix(rnorm(1*Rmax),Rmax,1)
gamma <- matrix(rnorm(2*Rmax),Rmax,2)
P_matrix <- 10^3*matrix(rnorm(2*2),2,2)
Yhat <- matrix(,data_len,1)
a1 <- 0
a2 <- 0
a4 <- matrix(rnorm(2),1,2)
a3 <- 0
Pz <- 0
P <- matrix(rnorm(1*Rmax),Rmax,1)
dist <- numeric(Rmax)
r <- 0.04
m3 <- 0
k <- 1

while (k < length(X)){  
 if(k == 1){  
 Cen[1,] <- Z[k,]; U[k,] <- 1; lambda <- matrix(sapply(U,function(x){x/sum

(U)}),Rmax,1); Yhat[k,] <- Xe[k,]%*%(t(w)%*%lambda)

} else {

a1 <- big_V(Z[k,]);a2 <- a2+ big_V(Z[k-1,]);a4 <- a4 + Z[k-1,];a3 <- sum(Z[k,]*a4)

B <- ((k-1)*(a1+1))+a2-(2*a3); Pz <- (k-1)/B

for(i in 1:length(P)){
    P[i] <- ((k-1)*P[i])/((k-2)+(P[i])+(P[i])*(dist(Z[k-1,],Z[k,])))
}
print(k)
for (i in 1:Rmax){
 dist[i] <- abs(sqrt(sum((Z[k,]-Cen[i,])^2)))
}

p1 <- min(dist)
p2 <- which.min(dist)

m1 <- max(P)
m2 <- which.max(P)
m3 <- (p1/r)+(Pz/m1)

if (Pz > m1 & m3 < 1){
Cen[m2,] <- Z[k,]
P[m2] <- Pz
}


for (i in 1:Rmax){
U[i] <- exp(-r*(abs(sqrt(sum((X[k,]-Cen[i,1])^2)))))
}

lambda <- sapply(U, function(x) x/sum(U)) 

P_matrix <- (diag(2)-(t(gamma)%*%lambda%*%Xe[k,]))%*%P_matrix

A <- lambda%*%Xe[k,]
Z1 <- P_matrix%*%t(A)
Z2 <- A%*%P_matrix%*%t(A)
Z3 <- diag(15)+Z2
gamma <- t(Z1%*%solve(Z3))


w_bar <- Xe[1,]%*%t(w)%*%lambda
w <-  w + (gamma*diag(e))

}  
} 
Yhat <- Xe%*%t(w)%*%lambda

我已经缩短了数据以便快速计算。


1
在代码行Yhat <- matrix(,data_len,1)中存在错误。您已经注释掉了定义data_len的那一行,请先解决这个问题好吗? - Ujjwal
我已经做出了更改。 - ALI KHAN
1个回答

0

我不确定你具体想做什么。但是,当R大于15时(因为Cen只有15行矩阵),就会出现错误。请检查这些行:

Rmax <- 15
Cen <- matrix(rnorm(2*Rmax),Rmax,2)

while (k < length(X)){  
 if(k == 1){  
R <- R+1; 
Cen[R,] <- Z[k,];  **error**

您正在逐步增加R。当R=16时,Cen[16,]未定义。


R并没有增加,它在开始时是R <- 0,但是它是多余的,我已经将其删除。 - ALI KHAN
在 while 循环中,将 R <- R+1; 执行。 - Ujjwal
好的,你现在遇到了什么错误? - Ujjwal
当我运行程序时,它进入了“运行”模式,我必须使用ESC键才能返回。 - ALI KHAN
2
你从未改变 k 的值(k=1),因此 while (k < length(X)) 是一个无限循环。 - Ujjwal

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接