11

我想从没有 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,但警告仍然存在。我不明白:我没有 NA,我的向量都是数字(我检查过)。我搜索了人们是否有同样的问题,但我能找到的只是向量的名称或类别造成的问题。

我的代码有什么问题?

4

1 回答 1

17

在这种特定情况下的问题

公式的右侧是1,这使它成为一个空模型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), ]
}

其他数据类型的警告

您会收到与公式、函数、表达式等类似的警告:

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'
于 2015-12-14T05:31:13.770 回答