在 R 中使用 .mids 对象创建训练数据集
Creating training dataset with .mids object in R
我有缺少组件的数据,所以我有 运行 小鼠算法(来自包 mice
)。函数 returns 一个 .mids 对象,我想将其拆分为训练数据集和测试数据集以评估模型拟合度。我希望训练和测试数据也为 .mids 形式,以便它们可以与各种其他函数结合使用,例如 pool
以根据鲁宾规则调整标准误差。
这是我的尝试,我只是从数据中删除行以获得训练集:
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)))
我遇到一个错误,指出它正在尝试用 7 行替换 9 行(大概是因为我减少了 train$data 中的行数而没有调整其他内容)。
如有任何帮助,我们将不胜感激。
一种方法是遍历 complete
数据集,然后将 mira
class 分配给列表,这应该允许 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
我有缺少组件的数据,所以我有 运行 小鼠算法(来自包 mice
)。函数 returns 一个 .mids 对象,我想将其拆分为训练数据集和测试数据集以评估模型拟合度。我希望训练和测试数据也为 .mids 形式,以便它们可以与各种其他函数结合使用,例如 pool
以根据鲁宾规则调整标准误差。
这是我的尝试,我只是从数据中删除行以获得训练集:
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)))
我遇到一个错误,指出它正在尝试用 7 行替换 9 行(大概是因为我减少了 train$data 中的行数而没有调整其他内容)。
如有任何帮助,我们将不胜感激。
一种方法是遍历 complete
数据集,然后将 mira
class 分配给列表,这应该允许 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