2014-10-31 96 views
5

如何從R的包mice中對mids類中的每個推定數據集執行操作(如子集或添加計算列)?我希望結果仍然是mids對象。對R的MICE中的每個推算數據集執行操作

編輯:實施例

library(mice) 
data(nhanes) 

# create imputed datasets 
imput = mice(nhanes) 

插補數據集被存儲爲列表

imput$imp 

那裏只有用於與插補對於給定的變量的觀察的行的列表。

原始的(不完全的)數據集存儲在這裏:

imput$data 

例如,我將如何創建在每個插補數據集的計算chl/2一個新的變量,產生一個新的對象mids

+0

如果你花時間創建一個[最小的,可重現的例子](http://stackoverflow.com/questions/5963269/how-to-make-a- great-r-reproducible-example)以便我們可以提供特定的代碼建議。這有點過於寬泛,也不具體。 – MrFlick 2014-10-31 03:43:32

+0

@ user20650,它確實將原始數據集存儲在'imput $ data'中,但它與推測數據集是分開的。我剛剛添加了一個例子。 – 2014-10-31 04:01:13

+0

如果你想產生'chl/2',你可以在插補之前計算它。與進行插補時相比,您添加的限制是,當缺少該列的任何插補值等於「chl/2」時 – user20650 2014-10-31 04:02:08

回答

3

給出另一種方法是計算之前對他們的歸集和地點限制的變量。

library(mice) 

# Create the additional variable - this will have missing 
nhanes$extra <- nhanes$chl/2 

# Change the method of imputation for extra, so that it always equals chl/2 
# change the predictor matrix so only chl predicts extra 
ini <- mice(nhanes, max = 0, print = FALSE) 

meth <- ini$meth 
meth["extra"] <- "~I(chl/2)" 

pred <- ini$pred # extra isnt used to predict 
pred[ "extra", "chl"] <- 1 

# Imputations 
imput <- mice(nhanes, seed=1, pred = pred, meth = meth, print = FALSE) 

,我們在小鼠中的例子:R中

1

還有就是with過載,可以幫助你在這裏

with(imput, chl/2) 

的文檔在?with.mids

+0

謝謝。但有沒有一種方法可以用它來實際修改每個推算數據集,例如通過添加計算列? '((imput,function(x)x $ imp $ new.var = chl/2)'不起作用,可能是因爲格式錯誤。 – 2014-10-31 04:31:43

+0

你爲什麼需要這樣做?帶()的''不能用於賦值。但是,用'with()'運行的任何東西都可以完成轉換。 – MrFlick 2014-10-31 04:33:31

4

這可以很容易如下進行多元插補由鏈式方程 -

使用complete()轉換一箇中頻對象爲長格式的數據。框架:

long1 <- complete(midsobj1, action='long', include=TRUE) 

執行任何操作需要:

long1$new.var <- long1$chl/2 
long2 <- subset(long1, age >= 5) 

使用as.mids()到後面操縱的數據轉換爲中頻對象:

midsobj2 <- as.mids(long2) 

現在你可以使用midsobj2要求。請注意,as.mids()需要include=TRUE(用於包含缺少值的原始數據)才能正確壓縮長格式的數據。需要注意的是小鼠中之前將有V2.25是在as.mids()中的錯誤函數(看到這個帖子https://stats.stackexchange.com/a/158327/69413

編輯:根據這一答案https://stackoverflow.com/a/34859264/4269699(從什麼本質上是一個重複的問題),你也可以編輯mids直接通過訪問$ data和$ imp來進行響應。因此,例如

midsobj2<-midsobj1 
midsobj2$data$new.var <- midsobj2$data$chl/2 
midsobj2$imp$new.var <- midsobj2$imp$chl/2 

你會遇到麻煩,但如果你想子集$小鬼或者如果你想使用$調用,所以我不建議一般這種解決方案。

+1

看來'as.mids'中的錯誤可能已在最新的小鼠版本中得到糾正(2.25,2015-11-09)。 – 2016-04-04 21:09:45

+0

這個工作適合你嗎?因爲使用'as.mids'後我得到了一些奇怪的結果。更多這裏:http://stackoverflow.com/questions/36511909/as-mids-replaces-added-values-with-na – 2016-04-11 13:10:17

相關問題