카테고리 보관물: stats

stats

일부 입력에 결 측값 (NA)이있는 경우 randomForest (R)로 예측 missing values na.row<-45 na.col<-c(3,5) case.na<-iris[na.row,] case.na[,na.col]<-NA iris.rf

randomForest새로운 사례의 클래스를 예측하는 응용 프로그램에서 사용하려는 훌륭한 분류 모델이 있습니다. 새 사례에는 필연적으로 누락 된 값이 있습니다. NA에게는 예측이 작동하지 않습니다. 그러면 어떻게해야합니까?

data(iris)
# create first the new case with missing values
na.row<-45
na.col<-c(3,5)
case.na<-iris[na.row,]
case.na[,na.col]<-NA

iris.rf <- randomForest(Species ~ ., data=iris[-na.row,])
# print(iris.rf)

myrf.pred <- predict(iris.rf, case.na[-5], type="response")
myrf.pred
[1] <NA>

나는 노력했다 missForest. 원래 데이터와 새 사례를 결합하여 missForest로 옮겼으며 새 사례에서 NA의 가치를 전가했습니다. 그래도 너무 무거운 컴퓨팅.

data.imp <- missForest(data.with.na)

그러나 rf-model을 사용하여 결 측값이있는 새로운 사례를 예측할 수있는 방법이 있어야합니다.



답변

값을 대치하거나 모델을 변경할 수밖에 없습니다. Hmisc 패키지에 올바른 선택이있을 수 있습니다. 나는 당신을 억류시키는 rfimpute보다 덜 무겁다 고 생각합니다. 첫 번째 패키지 예 (다른 것들이 있습니다) :

# Check that aregImpute can almost exactly estimate missing values when
# there is a perfect nonlinear relationship between two variables
# Fit restricted cubic splines with 4 knots for x1 and x2, linear for x3
set.seed(3)
x1 <- rnorm(200)
x2 <- x1^2
x3 <- runif(200)
m <- 30
x2[1:m] <- NA
a <- aregImpute(~x1+x2+I(x3), n.impute=5, nk=4, match='closest')
a
matplot(x1[1:m]^2, a$imputed$x2)
abline(a=0, b=1, lty=2)

x1[1:m]^2
a$imputed$x2

# Multiple imputation and estimation of variances and covariances of
# regression coefficient estimates accounting for imputation
# Example 1: large sample size, much missing data, no overlap in
# NAs across variables
x1 <- factor(sample(c('a','b','c'),1000,TRUE))
x2 <- (x1=='b') + 3*(x1=='c') + rnorm(1000,0,2)
x3 <- rnorm(1000)
y  <- x2 + 1*(x1=='c') + .2*x3 + rnorm(1000,0,2)
orig.x1 <- x1[1:250]
orig.x2 <- x2[251:350]
x1[1:250] <- NA
x2[251:350] <- NA
d <- data.frame(x1,x2,x3,y)
# Find value of nk that yields best validating imputation models
# tlinear=FALSE means to not force the target variable to be linear
f <- aregImpute(~y + x1 + x2 + x3, nk=c(0,3:5), tlinear=FALSE,
                data=d, B=10) # normally B=75
f
# Try forcing target variable (x1, then x2) to be linear while allowing
# predictors to be nonlinear (could also say tlinear=TRUE)
f <- aregImpute(~y + x1 + x2 + x3, nk=c(0,3:5), data=d, B=10)
f

# Use 100 imputations to better check against individual true values
f <- aregImpute(~y + x1 + x2 + x3, n.impute=100, data=d)
f
par(mfrow=c(2,1))
plot(f)
modecat <- function(u) {
 tab <- table(u)
 as.numeric(names(tab)[tab==max(tab)][1])
}
table(orig.x1,apply(f$imputed$x1, 1, modecat))
par(mfrow=c(1,1))
plot(orig.x2, apply(f$imputed$x2, 1, mean))
fmi <- fit.mult.impute(y ~ x1 + x2 + x3, lm, f, 
                       data=d)
sqrt(diag(vcov(fmi)))
fcc <- lm(y ~ x1 + x2 + x3)
summary(fcc)   # SEs are larger than from mult. imputation

독립 변수에 결 측값이있는 많은 새로운 관측 값이 있다고 언급했습니다. 이와 같은 경우가 많지만 각각의 새로운 관측에 대해 하나 또는 두 개의 변수에 누락이 있고 변수의 양이 작지 않은 경우 구멍을 중간 또는 평균으로 채울 수 있습니다 (연속입니까?) 작동 할 수 있습니다.

흥미로운 또 다른 것은 사소한 변수 중요도 분석을 수행하는 것입니다. 랜덤 포레스트 R 구현은 두 가지 중요도 측정 값과 각 플롯을 계산합니다.

varImpPlot(yourRandomForestModel) # yourRandomForestModel must have the argument importance=TRUE 

그리고 예측 정확도가 “전체 모델”에 비해 영향을받지 않을 때까지 모델 훈련에 “중요한”변수를 포함 시켜서 놀 수 있습니다. 누락이 적은 변수를 유지할 수 있습니다. 문제의 크기를 줄이는 데 도움이 될 수 있습니다.


답변