如何获得在 R 中的 multinom() 中分析的准确观察结果,或者如何使 fitted() 对包括 NAs 在内的整个数据产生拟合

how to get the exact observations analyzed in multinom() in R, or how to make fitted() produce a fit on entire data including NAs

我的问题类似于另一个较旧的问题 "How to get the number of observations included in a model created using the function multinom in R?",但我想要寻找的是在模型中分析的确切观察结果,而不是观察结果的数量。最终,我希望将原始数据集与预测(拟合)概率的新列结合起来。但是让我用一个例子来说明我的问题:

如果我的样本是1000,有些变量有NA值,我在R中拟合了一个multinom(),并使用了fitted(),然后发现fitted()的长度只有870,也就是说有130个obs估计模型时排除。现在, fitted() 仅生成 870*1 (即一列)数字(概率),我无法知道每个概率数字对应于哪个观察值。我认为有两种方法可以解决这个问题:

  1. 在估计模型之前找出哪些观察被排除在原始数据中并删除它们。
  2. 尝试让 fitted() 产生一个 1000*1 的矩阵,其中 130 个元素为 NA。

我不知道任何一个的答案。任何意见,将不胜感激。最终目标是能够将拟合概率附加到原始数据集(作为新列),以便我可以得出推论。谢谢。

来自 ?multinom in nnet:

   model: logical. If true, the model frame is saved as component
          'model' of the returned object.

所以调用multinom(..., model=TRUE),模型框架将在结果中。

编辑:

按照?multinom中的例子:

options(contrasts = c("contr.treatment", "contr.poly"))
library(MASS)
example(birthwt)
bwt.mu <- multinom(low ~ ., bwt, model=TRUE)

查看对象内部模型框:

>     str(bwt.mu$model)
'data.frame':   189 obs. of  9 variables:
 $ low  : Factor w/ 2 levels "0","1": 1 1 1 1 1 1 1 1 1 1 ...
 $ age  : int  19 33 20 21 18 21 22 17 29 26 ...
 $ lwt  : int  182 155 105 108 107 124 118 103 123 113 ...
 $ race : Factor w/ 3 levels "white","black",..: 2 3 1 1 1 3 1 3 1 1 ...
 $ smoke: logi  FALSE FALSE TRUE TRUE TRUE FALSE ...
 $ ptd  : Factor w/ 2 levels "FALSE","TRUE": 1 1 1 1 1 1 1 1 1 1 ...
 $ ht   : logi  FALSE FALSE FALSE FALSE FALSE FALSE ...
 $ ui   : logi  TRUE FALSE FALSE TRUE TRUE FALSE ...
 $ ftv  : Factor w/ 3 levels "0","1","2+": 1 3 2 3 1 1 2 2 2 1 ...
 - attr(*, "terms")=Classes 'terms', 'formula' length 3 low ~ age + lwt + race + smoke + ptd + ht + ui + ftv
  .. ..- attr(*, "variables")= language list(low, age, lwt, race, smoke, ptd, ht, ui, ftv)
  .. ..- attr(*, "factors")= int [1:9, 1:8] 0 1 0 0 0 0 0 0 0 0 ...
  .. .. ..- attr(*, "dimnames")=List of 2
  .. .. .. ..$ : chr [1:9] "low" "age" "lwt" "race" ...
  .. .. .. ..$ : chr [1:8] "age" "lwt" "race" "smoke" ...
  .. ..- attr(*, "term.labels")= chr [1:8] "age" "lwt" "race" "smoke" ...
  .. ..- attr(*, "order")= int [1:8] 1 1 1 1 1 1 1 1
  .. ..- attr(*, "intercept")= int 1
  .. ..- attr(*, "response")= int 1
  .. ..- attr(*, ".Environment")=<environment: R_GlobalEnv> 
  .. ..- attr(*, "predvars")= language list(low, age, lwt, race, smoke, ptd, ht, ui, ftv)
  .. ..- attr(*, "dataClasses")= Named chr [1:9] "factor" "numeric" "numeric" "factor" ...
  .. .. ..- attr(*, "names")= chr [1:9] "low" "age" "lwt" "race" ...