循环回归但得到“ coef(summary(fit))[2,4]中的错误:下标超出范围”

时间:2018-07-22 15:38:36

标签: r loops regression glm

在高维数据集上运行以下代码时,出现错误消息

  

coef(summary(fit))[2,4]中的错误:下标超出范围

将逻辑回归模型的p值保存到的向量 beta 的长度为19481。如果我遍历回归模型的不同自变量达100次,则不会得到这个错误。

谁能给我提示为什么我的代码运行不流畅?

  beta = rep(0,19481)
为(我在25:19505中){
  适合= glm(mdr.mdr〜an.mdr [,i],family = binomial)
  beta [i-24] = coef(summary(fit))[2,4]
  }
 

2 个答案:

答案 0 :(得分:1)

当您尝试提取系数表的[2,4]元素(即斜率的p值)时出现错误,我敢肯定您对斜率的估计为NA。 / p>

这意味着对于某些i,您的模型缺乏等级,并且没有任何信息可以估算斜率。

请注意,coef(summary(fit))将丢弃NA估计值,因此在这种情况下,系数表只有一行而不是两行(这说明了“越界”错误)。参见Coefficient table does not have NA rows in rank-deficient fit; how to insert them?

我建议以下内容:

beta = rep(NA, 19481)
for (i in 25:19505) {
  fit = glm(mdr.mdr ~ an.mdr[,i], family = binomial)
  slope <- coef(fit)[2]
  if (!is.na(slope)) beta[i-24] = coef(summary(fit))[2,4]
  }

此循环的另一个潜在失败是“没有完整的情况”,即sum(complete.cases(mdr.mdr, an.mdr[, i]))给您0。如果发生这种情况,您可能想要:

beta = rep(NA, 19481)
for (i in 25:19505) {
  if (sum(complete.cases(mdr.mdr, an.mdr[, i])) > 0) {
    fit = glm(mdr.mdr ~ an.mdr[,i], family = binomial)
    slope <- coef(fit)[2]
    if (!is.na(slope)) beta[i-24] = coef(summary(fit))[2,4]
    }
  }

答案 1 :(得分:0)

运行循环,然后在循环停止时在控制台中键入i,然后按Enter。这将告诉您该循环在哪个循环迭代中失败。然后检查an.mdr[,i]是否有意外情况

尝试一下:

  beta = rep(0, 19481) 
  for (i in 25:19505) {
      fit = glm(mdr.mdr ~ an.mdr[,i], family=binomial) 
      if (is.na(coef(summary(fit))[2,4]) { beta[i-24] = NA }
      if (!is.na(coef(summary(fit))[2,4]) { beta[i-24] = coef(summary(fit))[2,4] }
  }