2016-05-04 3 views
4

У меня есть данные с отсутствующими компонентами, поэтому я запустил алгоритм мышей (из пакета mice). Функция возвращает объект .mids, который я хочу разделить на обучение и тестовый набор данных для оценки соответствия модели. Я хочу, чтобы данные обучения и тестирования были из .mids, чтобы они могли быть объединены с различными другими функциями, такими как pool, чтобы настроить стандартные ошибки в соответствии с правилами Рубина.Создание учебного набора данных с объектом .mids в R

Вот моя попытка, где я просто удалить строки из данных, чтобы получить обучающий набор:

library(mice) 
data <- mice(nhanes,m=2,maxit=5,seed=1) 

set.seed(2) 
rand <- (1:nrow(nhanes))*rbinom(nrow(nhanes),size=1,prob=0.7) 
train <- data 
train$data <- train$data[rand,] 

Но тогда, если я пытаюсь запустить модель с этими данными:

pool(with(train, lm(bmi ~ chl + age))) 

я сталкиваюсь ошибка, заявляющая, что она пытается заменить 9 строк на 7 (предположительно потому, что я уменьшил количество строк в данных поезда $, не изменяя и другие вещи).

Любая помощь будет высоко оценена.

ответ

1

Один из способов - проложить через набор данных complete, а затем присвоить список mira, что должно позволить pool ing. (Которая на самом деле, что делает mice:::with.mids)

Пример без отбора проб

library(mice) 

imp <- mice(nhanes,m=2, maxit=5, seed=1) 

# With in-built pooling 
pool(with(imp, lm(bmi ~ chl + age))) 

# Pooled coefficients: 
# (Intercept)   chl   age 
# 21.38496144 0.05975537 -3.40773396 
# 
# Fraction of information about the coefficients missing due to nonresponse: 
# (Intercept)   chl   age 
# 0.6186312 0.1060668 0.7380962 

# looping manually 
mod <- list(analyses=vector("list", imp$m)) 

for(i in 1:imp$m){ 
    mod$analyses[[i]] <- lm(bmi ~ chl + age, data=complete(imp, i)) 
} 

class(mod) <- c("mira", "matrix") 
pool(mod) 

# Pooled coefficients: 
# (Intercept)   chl   age 
# 21.38496144 0.05975537 -3.40773396 
# 
# Fraction of information about the coefficients missing due to nonresponse: 
# (Intercept)   chl   age 
# 0.6186312 0.1060668 0.7380962 

Кажется хорошо, так что добавьте в процедуре отбора проб

mod <- list(analyses=vector("list", imp$m)) 

set.seed(1) 
for(i in 1:imp$m){ 
    rand <- (1:nrow(nhanes))*rbinom(nrow(nhanes),size=1,prob=0.7) 
    mod$analyses[[i]] <- lm(bmi ~ chl + age, data=complete(imp, i)[rand,]) 
} 

class(mod) <- c("mira", "matrix") 
pool(mod) 

# Pooled coefficients: 
# (Intercept)   chl   age 
# 21.72382272 0.06468044 -4.23387415 
# 
# Fraction of information about the coefficients missing due to nonresponse: 
# (Intercept)   chl   age 
# 0.1496987 0.4497024 0.6101340 
Смежные вопросы