2017-05-23 2 views
0

私はRで堅牢なglmsを実装することを学んでいますが、コリニアリティのためにいくつかの列が削除されたモデルを持っている場合、回帰モデルから値を予測するglmobを得ることができません。具体的には、予測関数を使用してglmrobから値を予測するとき、常にすべての値に対してNAを与えます。 glmを使用して同じデータ&モデルからの値を予測するとき、私はこれを観察しません。当てはめられたモデルにNA係数があり(かつNAが係数ベクトルの最後の係数ではない)限り、私が使用するデータは重要ではないようですが、予測は機能しません。R:glmはできますが、glmrobは共直線列を落としたモデルを予測できません。

この現象は、内部直線が共直線性のために削除された場合のデータセットおよびモデルすべてに適用されます。モデルから2つの列が削除された偽のデータセットが含まれています。これにより、係数リストに2つのNAsが与えられます。 glmとglmrobの両方でほぼ同じ係数が得られますが、glmモデルでの動作のみが予測されます。だから私の質問です:私は予測値を生成するから私のglmrobモデルを防ぐ頑強な回帰について私は理解できません?

library(robustbase) 

#Make fake data with two categorial predictors 
df <- data.frame("category" = rep(c("A","B","C"),each=6)) 
df$location <- rep(1:6,each=3) 
val <- rep(c(500,50,5000),each=6)+rep(c(50,100,25,200,100,1),each=3) 
df$value <- rpois(NROW(df),val) 

#note that predict works if we omit the newdata parameter. However I need the newdata param 
#so I use the original dataframe here as a stand-in. 
mod <- glm(val ~ category + as.factor(location), data=df, family=poisson) 
predict(mod, newdata=df) # works fine 

mod <- glmrob(val ~ category + as.factor(location), data=df, family=poisson) 
predict(mod, newdata=df) #predicts NA for all values 

答えて

0

私はこれに掘ってきたし、問題はロバスト回帰の私の理解では存在しないと結論しているのではなく、問題はrobustbaseパッケージのバグです。 predict.lmrob関数は、予測の前にモデルから必要な係数を正しく選択しません。最初のx個の非NA係数(x =モデル行列のランク)を選択する必要があります。代わりに、それらがNAであるか否かをチェックすることなく、単に第1のx係数を選択するだけである。これは、この問題が、NAが係数ベクトルの最後の係数ではないモデルの原因となる理由を説明しています。

は、この問題を解決するために、私が使用してpredict.lmrobソースをコピー:

getAnywhere(predict.lmrob) 

をし、自分の置換機能を作成しました。この機能では、コードを一度修正しました:

... 
p <- object$rank 
if (is.null(p)) { 
    df <- Inf 
    p <- sum(!is.na(coef(object))) 
    #piv <- seq_len(p) # old code 
    piv <- which(!is.na(coef(object))) # new code 
} 
else { 
    p1 <- seq_len(p) 
    piv <- if (p) 
     qr(object)$pivot[p1] 
} 
... 

私はこの変更を使用して数百のデータセットを実行しましたが、うまくいきました。

関連する問題