1. ホーム
  2. r

[解決済み】'NULL'型の非(リストまたはベクトル)に適用されるis.na()は何を意味するのか?

2022-02-21 07:31:16

質問

NAがないdata.frameからforward procedureで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)
)

フォワードは最初のステップで終わり、こう言います。

in is.na(fit$coefficients) : is.na() は 'NULL' 型の非 (リストまたはベクトル) に適用されます。

(3回)

上位機種を変更しようと、さらに upper = ~ 1 が、警告が出たままです。理解できません。NAはなく、ベクターはすべて数値です(確認済み)。 同じ問題を持つ人がいるかどうか検索しましたが、私が見つけることができたのは、ベクトルの名前またはクラスによる問題だけでした。

私のコードのどこが問題なのでしょうか?

どうすればいいですか?

具体的な事例での問題点

あなたの計算式の右側は 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'