0

欠損値が 50% を超える場合に、欠損値を処理する際の 2 つの R パッケージ、missForest および Hmisc のパフォーマンスを比較しようとしています。

この方法でテストデータを取得しました:

data("iris")
library(missForest)
iris.mis <- prodNA(iris, noNA = 0.6)
summary(iris.mis)

mis1 <- iris.mis
mis2 <- iris.mis

missForest ではmixError()、代入精度を元データと比較できるメソッドを持っています。

# using missForest
missForest_imputed <- missForest(mis1, ntree = 100)
missForest_error <- mixError(missForest_imputed$ximp, mis1, iris)
dim(missForest_imputed$ximp)
missForest_error

Hmisc にはメソッドがありません。次のようmixError()に、その強力なaregImpute()代入を使用しています。

# using Hmisc
library(Hmisc)
hmisc_imputed <- aregImpute(~Sepal.Length + Sepal.Width + Petal.Length + Petal.Width + Species, 
                        data = mis2, n.impute = 1)

メソッドmissForest_imputed$ximpを使用できるように、帰属結果を のような形式に変換したいと考えていました。mixError()問題は、 でaregImpute()、試してn.impute = 1n.impute = 5、元のデータの虹彩のように各機能に 150 の値を持つことができないことです...そして、各機能の値の数も異なります....

では、欠損値を処理する際に missForest と Hmisc のパフォーマンスを比較する方法はありますか?

4

1 に答える 1

1

パート1

Hmisc::aregImpute帰属値を返します。という名前のオブジェクトの場合hmisc_imputed、それらは にありますhmisc_imputed$imputed。ただし、imputedオブジェクトは各次元のリストです。

と同等のものを再作成したい場合missForest_imputed$ximpは、自分で行う必要があります。そうするために、次の事実を使用できます。

all.equal(as.integer(attr(xx$Sepal.Length, "dimnames")[[1]]), which(is.na(iris.mis$Sepal.Length))) ## returns true

私がここで行うこと:

check_missing <- function(x, hmisc) {
  return(all.equal(which(is.na(x)), as.integer(attr(hmisc, "dimnames")[[1]])))
}

get_level_text <- function(val, lvls) {
  return(lvls[val])
}

convert <- function(miss_dat, hmisc) {
  m_p <- ncol(miss_dat)
  h_p <- length(hmisc)
  if (m_p != h_p) stop("miss_dat and hmisc must have the same number of variables")
  # assume matches for all if 1 matches
  if (!check_missing(miss_dat[[1]], hmisc[[1]]))
    stop("missing data an imputed data do not match")

  for (i in 1:m_p) {
    i_factor <- is.factor(miss_dat[[i]])
    if (!i_factor) {miss_dat[[i]][which(is.na(miss_dat[[i]]))] <- hmisc[[i]]}
    else {
      levels_i <- levels(miss_dat[[i]])
      miss_dat[[i]] <- as.character(miss_dat[[i]])
      miss_dat[[i]][which(is.na(miss_dat[[i]]))] <- sapply(hmisc[[i]], get_level_text, lvls= levels_i)
      miss_dat[[i]] <- factor(miss_dat[[i]])
    }
  }
  return(miss_dat)
}

iris.mis2 <- convert(iris.mis, hmisc_imputed$imputed)

パート2

mixErrorRMSE を使用してエラー率を計算します?mixError

代入エラー。連続変数のみの場合、これは正規化された二乗平均平方根誤差です (NRMSE、詳細については「help(missForest)」を参照してください)。カテゴリ変数のみの場合、これは誤って分類されたエントリ (PFC) の割合です。混合タイプの変数の場合、両方のエラー測定値が提供されます。

「パート 1」[ ] のオブジェクトでこれを行うには、 で提供されている関数iris.mis2を使用するだけです。nrmselibrary(missForest)

于 2016-06-14T19:21:30.060 に答える