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

Vin*_*ent 9 r cox-regression na

我想从没有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))
)
Run Code Online (Sandbox Code Playgroud)

这个表没有任何意义,但如果我们尝试建立一个模型:

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)
)
Run Code Online (Sandbox Code Playgroud)

前锋在第一步结束时说:

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

(三次)

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

我的代码出了什么问题?

Ric*_*ton 15

这个特定情况下的问题

公式的右侧是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'
Run Code Online (Sandbox Code Playgroud)

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

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'
Run Code Online (Sandbox Code Playgroud)

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

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

与其他数据类型的警告

你会得到一个带有公式,函数,表达式等的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'
Run Code Online (Sandbox Code Playgroud)