1. ホーム
  2. r

[解決済み] model.frame.default(Terms, newdata, na.action = na.action, xlev = object$xlevels) におけるエラー:要因Xが新しいレベルを持っています。

2022-02-25 23:44:15

質問

ロジスティック回帰を行いました。

 EW <- glm(everwrk~age_p + r_maritl, data = NH11, family = "binomial")

さらに everwrk の各レベルに対して r_maritl .

r_maritl には以下のレベルがあります。

levels(NH11$r_maritl)
 "0 Under 14 years" 
 "1 Married - spouse in household" 
 "2 Married - spouse not in household"
 "3 Married - spouse in household unknown" 
 "4 Widowed"                               
 "5 Divorced"                             
 "6 Separated"                             
 "7 Never married"                        
 "8 Living with partner"  
 "9 Unknown marital status"  

だから、そうしたんだ。

predEW <- with(NH11,
expand.grid(r_maritl = c( "0 Under 14 years", "1 Married - 
spouse in household", "2 Married - spouse not in household", "3 Married - 
spouse in household unknown", "4 Widowed", "5 Divorced", "6 Separated", "7 
Never married", "8 Living with partner", "9 Unknown marital status"),
age_p = mean(age_p,na.rm = TRUE)))

cbind(predEW, predict(EW, type = "response",
                        se.fit = TRUE, interval = "confidence",
                        newdata = predEW))

問題は、次のようなレスポンスが返ってくることです。

Model.frame.default(Terms, newdata, na.action = na.action, xlev =) Error in model.frame.default(Terms, newdata, na.action = na.action, xlev =) object$xlevels) : 因子 r_maritl は新しいレベル 0 14歳未満, 既婚者 - 世帯の配偶者不明

サンプルデータです。

str(NH11$age_p)
num [1:33014] 47 18 79 51 43 41 21 20 33 56 ...

str(NH11$everwrk)
Factor w/ 2 levels "2 No","1 Yes": NA NA 2 NA NA NA NA NA 2 2 ...

str(NH11$r_maritl)
Factor w/ 10 levels "0 Under 14 years",..: 6 8 5 7 2 2 8 8 8 2 ...

解決方法は?

tl;dr データで表現されていないいくつかのレベルが要因にあり、それがモデルで使用される要因から削除されているように見えます。 これらのレベルに対する反応を予測することができないので、後から考えると、これはそれほど驚くことではありません。 とはいえ、これは 温和に を生成するような素晴らしいことをRがやってくれないのは驚きです。 NA の値を自動的に取得します。 この問題を解決するには levels(droplevels(NH11$r_maritl)) は、予測フレームを構築する際に、あるいは同等に EW$xlevels$r_maritl .

再現性のある例です。

maritl_levels <- c( "0 Under 14 years", "1 Married - spouse in household", 
  "2 Married - spouse not in household", "3 Married - spouse in household unknown", 
  "4 Widowed", "5 Divorced", "6 Separated", "7 Never married", "8 Living with partner", 
 "9 Unknown marital status")
set.seed(101)
NH11 <- data.frame(everwrk=rbinom(1000,size=1,prob=0.5),
                 age_p=runif(1000,20,50),
                 r_maritl = sample(maritl_levels,size=1000,replace=TRUE))

ミッシングレベルを作ろう

NH11 <- subset(NH11,as.numeric(NH11$r_maritl) != 3)

モデルをフィットさせる。

EW <- glm(everwrk~r_maritl+age_p,data=NH11,family=binomial)
predEW <- with(NH11,
  expand.grid(r_maritl=levels(r_maritl),age_p=mean(age_p,na.rm=TRUE)))
predict(EW,newdata=predEW)

成功!

<ブロッククオート

model.frame.default(Terms, newdata, na.action = na.action, xlev = object$xlevels) でエラーが発生しました。 factor r_maritl has new levels 2 Married - spouse not in household.

predEW <- with(NH11,
           expand.grid(r_maritl=EW$xlevels$r_maritl,age_p=mean(age_p,na.rm=TRUE)))
predict(EW,newdata=predEW)