当增加数据大小时,函数产生NA

时间:2019-03-15 03:59:16

标签: r for-loop optimization

我正在R中实现我的函数,并尝试得出结果以确定它是否是我期望的结果。我要评估的功能是:

enter image description here

该函数在我增加数据矩阵的大小之前一直有效(例如,它适用于N = 10,但不适用于N = 12,下面将举一个示例)。

我确定我的实现与溢出问题有关。

SELECT t1.c1, t2.c2
FROM   unnest ('{1, 2, 3, 4}'::int[]
             , '{3, 2, 4, 1}'::int[]) WITH ORDINALITY i(id1, id2, ord)
LEFT   JOIN tbl1 t1 ON t1.id = i.id1
LEFT   JOIN tbl2 t2 ON t2.id = i.id2
ORDER  BY ord;

出了什么问题?我看不到问题。

任何帮助都会很棒!

2 个答案:

答案 0 :(得分:1)

问题出在obj_fun的此循环中,涉及到alpha使用的内容:

for(i in 1:N){
    for(k in 1:N){
      inner.product[k] <- alpha[i]*alpha[k]*...
    }
  }

两件事:

(1)设置了N=12,但您调用了obj_fun(..., alpha=alpha.vector[i,]),其中alpha.vector[i,]是长度为11的向量。我在上面粘贴的循环尝试在{{ 1}},即alpha[i]是因为i=N中没有第12个元素

(2)请注意,当您执行双循环时会发生什么:当NAalpha时,您将一个值分配给i=1。然后k=1inner.product[1],然后为i=1分配一个值。直到k=2更改为inner.product[2]为止,这是好的。当ii=2时,您可以通过为其分配新值来覆盖i=2。这种情况一直持续到k=1inner.product[1],此时您为所有i=N覆盖了k=N,但是这次是inner.product[k],因为您执行了涉及{{ 1}}和k都在NA的“外部”,正如上面(1)所述。因此,所有alpha[i]都充满了alpha[k]


编辑:根据您添加到问题中的数学方程式,以及您对alphainner.productNA都是长度为n的向量的表示,我相信此函数会做你想要的:

alpha

答案 1 :(得分:0)

尝试一下:

set.seed(4997)
options(digits = 4,scipen = -4)
N = 12
sample.data <- gen.sample(n=N)
X.data <- sample.data$x
y.vec <- sample.data$y

    alpha.vector <- matrix(rep(c(-6,-5,-4,-3,-2,-1,0,1,2,3,4,5,6),13*N),ncol = 13, nrow = N, byrow = TRUE)
    for(j in 1:N){
      alpha.vector[j,2] <- rnorm(1,5,5)
    }

for(i in 1:N){
  print(obj_fun(X = X.data, y = y.vec, alpha =  alpha.vector[i,]))
}

问题在这里:

obj_fun <- function(X,y,alpha){

  N <- length(X) 
  inner.product <- numeric(N)
  for(i in 1:N){
    for(k in 1:N){
      inner.product[k] <- alpha[i]*alpha[k]*
        y[i]*y[k]*(t(as.numeric(X[i]))%*%as.numeric(X[k]))
    }
  }
  L_D <- sum(alpha) - 0.5*sum(inner.product)
  return(L_D)
}

此功能从1循环到12,但是alpha没有元素1211

顺便说一句:通过使用apply系列和其他更改,可以改进这种循环执行代码的方式!