应用于'NULL'类型的非(列表或向量)的is.na()是什么意思?

时间:2013-06-20 09:09:02

标签: r na cox-regression

我想从没有NA的data.frame中选择具有正向过程的Cox模型。以下是一些示例数据:

test <- data.frame(
  x_1   = runif(100,0,1),
  x_2   = runif(100,0,5),
  x_3   = runif(100,10,20),
  time  = runif(100,50,200),
  event = c(rep(0,70),rep(1,30))
)

此表没有任何意义,但如果我们尝试构建模型:

modeltest <- coxph(Surv(time, event) ~1, test)
modeltest.forward <- step(
  modeltest, 
  data      = test, 
  direction = "forward", 
  scope     = list(lower = ~ 1, upper = ~ x_1 + x_2 + x_3)
)

前锋在第一步结束时说:

  

在is.na(fit $ coefficients)中:is.na()应用于'NULL'类型的非(列表或向量)

(三次)

我试图改变上层模型,我甚至试过upper = ~ 1,但警告仍然存在。我不明白:我没有NAs,我的载体都是数字(我检查过)。 我搜索了人们是否有同样的问题,但由于矢量的名称或类别,我能找到的只是问题。

我的代码出了什么问题?

1 个答案:

答案 0 :(得分:14)

此特定情况下的问题

公式的右侧是1,这使其成为 null模型coxph调用coxph.fit,这可能(懒得)懒得返回空模型的系数。

以后coxph调用extractAIC,错误地假定模型对象包含名为coefficients的元素。

一般情况

is.na假定其输入参数是原子矢量或矩阵或列表或data.frame。其他数据类型会导致警告。正如您所见,NULL会发生这种情况:

is.na(NULL)
## logical(0)
## Warning message:
## In is.na(NULL) : is.na() applied to non-(list or vector) of type 'NULL'

此问题的一个常见原因是尝试访问列表中的元素或不存在的数据框的列。

d <- data.frame(x = c(1, NA, 3))
d$y # "y" doesn't exist is the data frame, but NULL is returned
## NULL
is.na(d$y)
## logical(0)
## Warning message:
## In is.na(d$y) : is.na() applied to non-(list or vector) of type 'NULL'

您可以通过在操作列之前检查列是否存在来防止这种情况发生。

if("y" in colnames(d))
{
  d2 <- d[is.na(d$y), ]
}

其他数据类型的警告

您会收到包含公式,函数,表达式等的simliar警告:

is.na(~ NA)
## [1] FALSE FALSE
## Warning message:
## In is.na(~NA) : is.na() applied to non-(list or vector) of type 'language'

is.na(mean)
## [1] FALSE
## Warning message:
## In is.na(mean) : is.na() applied to non-(list or vector) of type 'closure'

is.na(is.na)
## [1] FALSE
## Warning message:
## In is.na(is.na) : is.na() applied to non-(list or vector) of type 'builtin'

is.na(expression(NA))
## [1] FALSE
## Warning message:
## In is.na(expression(NA)) :
##   is.na() applied to non-(list or vector) of type 'expression'