如何处理R中for循环中的缺失数据(NA)
我试图计算观察和模拟数据的卡方误差,并使用贝叶斯推理评估模型拟合。观察到的数据集包含缺少的(“NA”)值。但是,模拟值不存在缺失值。因此,我无法比较它们之间的差异统计数据 下面给出的代码是一个示例,与我的工作类似:如何处理R中for循环中的缺失数据(NA),r,for-loop,missing-data,R,For Loop,Missing Data,我试图计算观察和模拟数据的卡方误差,并使用贝叶斯推理评估模型拟合。观察到的数据集包含缺少的(“NA”)值。但是,模拟值不存在缺失值。因此,我无法比较它们之间的差异统计数据 下面给出的代码是一个示例,与我的工作类似: p <- array(runif(3000*195*6, 0, 1), c(3000, 195, 6)) N <- array(rpois(3000*195, 10), c(3000, 195)) y <- array(0, c(195, 6)) for(j in
p <- array(runif(3000*195*6, 0, 1), c(3000, 195, 6))
N <- array(rpois(3000*195, 10), c(3000, 195))
y <- array(0, c(195, 6))
for(j in 1:195){
for(k in 1:6){
y[j,k] <- (rbinom(1, N[j], p[1,j,k]))
}
}
foo <- runif(50, 1, 195)
bar <- runif(50, 1, 6)
for(i in 1:50){
y[foo[i], bar[i]] <- NA
}
谢谢,
Dan您可以在内部循环中添加一个测试,并更改循环的顺序,如下所示:
...
for(j in 1:195){
for(k in 1:6){
if ( !is.na(y(j,k)) ) {
for(i in 1:3000){
...
}
}
}
}
...
为了提高效率,将内部循环矢量化(如上面的注释所述)
还可以定义与表示定义位置子集的
y
尺寸相同的逻辑数组,例如,subset您可以在内部循环中添加测试,并按如下方式更改循环顺序:
...
for(j in 1:195){
for(k in 1:6){
if ( !is.na(y(j,k)) ) {
for(i in 1:3000){
...
}
}
}
}
...
为了提高效率,将内部循环矢量化(如上面的注释所述)
也可以定义与表示定义位置子集的y
尺寸相同的逻辑数组,例如y中的子集。新[j,k]
行,您是否有意仅指N[1:195]
(即N的第一列的前195行)?类似地,对于p
,您只参考第1:195行(共3000行)和第1至第6列(共195列)。Oops是在早期版本中调整内容时留下的。现在对其进行了更新,以反映适当的[i,j,k]。谢谢。你的东西可以矢量化。要计算eval
和E
,您应该能够使用eval,然后,如果您想要识别那些NA
的元素,以便在其他矩阵中也将它们设置为NA
,请尝试@jbaums正确指示的y.new[is.NA(y)],is.na
是您需要使用na
s查找或执行逻辑操作的函数。关于那些NA
s的查找,如果您想这样做,可以使用which(is.NA(y),arr.ind=TRUE)
。这样,您将获得y
中NA
值的行数和列数。在y.new[j,k]
行中,您是否有意仅指N[1:195]
(即N的第一列的前195行)?类似地,对于p
,您只参考第1:195行(共3000行)和第1至第6列(共195列)。Oops是在早期版本中调整内容时留下的。现在对其进行了更新,以反映适当的[i,j,k]。谢谢。你的东西可以矢量化。要计算eval
和E
,您应该能够使用eval,然后,如果您想要识别那些NA
的元素,以便在其他矩阵中也将它们设置为NA
,请尝试@jbaums正确指示的y.new[is.NA(y)],is.na
是您需要使用na
s查找或执行逻辑操作的函数。关于那些NA
s的查找,如果您想这样做,可以使用which(is.NA(y),arr.ind=TRUE)
。这样,您就可以获得y
中NA
值的行数和列数。
...
for(j in 1:195){
for(k in 1:6){
if ( !is.na(y(j,k)) ) {
for(i in 1:3000){
...
}
}
}
}
...