如何生成缺失的数据结构以对 R 中的高维数据进行 运行 模拟?
How can I generate missing data structures to run simulations on high dimensional data in R?
在R程序中,我将使用以下代码生成高维数据集,并使用MAR、MCAR和MNAR机制创建缺失数据集,缺失率分别为5%、25%和40%:
generateData<- function(n,p) {
sigma <- diag(p)
sigma <- replace(sigma, sigma == 0, 0.3)
mu= rep(0,nrow(sigma))
X <- mvrnorm(n, mu = mu, Sigma = sigma)
vCoef = rnorm(ncol(X))
vProb =exp(X%*%vCoef)/(1+exp(X%*%vCoef))
Y <- rbinom(nrow(X), 1, vProb)
data= data.frame(cbind(X,Y))
return(data)
}
data <- generateData(n = 100,p=120)
X <- data[-ncol(data)]
Y <- data[ncol(data)]
接下来我将比较插补方法的性能。我尝试使用 ampute 函数生成缺失的数据集,但是当我 运行 代码时出现以下错误,我认为这与模式和权重有关:
result <- ampute(X, prop = 0.4, mech ='MAR', type="RIGHT", bycases=FALSE)
Error: Proportion of missing cells is too large in combination with the desired number of missing variables
在使用截肢功能时,我无法对模式和重量进行必要的调整。我为 MAR、MCAR 和 MNAR 尝试了各种模式和权重值,但没有用。另外,我不知道是否有必要使用所有变量或仅使用部分变量(例如,前 50 个变量)来创建缺失数据集来创建缺失数据集。
作为插补方法,我将使用 EM、KNN、随机森林、基于回归的方法、朴素贝叶斯、人工神经网络以及经典方法。我可以通过对截肢功能进行必要的调整来使用它还是应该使用其他功能?预先感谢您的帮助。
I think you should provide a MWE in order to reproduce your error.
Since I don't know what mypattern is like, I can't help you!
感谢您的回答!尽管我尝试了不同的模式,但每次都出现相同的错误。例如,我尝试使用如下所示的模式在前 50 个变量中创建缺失数据:
############### PATTERN ###########################
a <- ncol(X)
b <- 50
mypattern <- matrix(rep(1, a*b), ncol=a, nrow=b)
for(i in 1:b) {
mypattern[i,i] = 0
}
默认情况下创建模式时问题仍然存在。我将上面的代码更新为默认模式。
由于您正在编辑一些缺失的交叉引用,我删除了我的旧答案(应该是评论)并试图在此处完成并总结我的答案。
我认为这里的问题是由于误用了参数 bycases
。事实上,如果它设置为 FALSE
,prop
参数定义数据框中缺失条目的比例。如果您设置 prop = .4
,给定数据框的维度(120,000 个条目)和默认模式(其中缺失仅在一个变量上),您要求一个数据框在一个变量上有 4800 个缺失值(有 100 个条目)。
如果考虑以个案来定义缺失的比例
data <- generateData(n = 100, p=120)
X <- data[-ncol(data)]
Y <- data[ncol(data)]
result2 <- ampute(X, prop = 0.4)
result2$prop
#[1] 0.4
没有错误发生,因为您需要 40 个观察值(总计 100 个)在一个变量上有缺失值(因为我们仍在使用默认模式)。
如果你想考虑 bycases = FALSE
你应该定义一个模式来导致多个变量缺失,或者设置一个比例,使得单个协变量的缺失值数量小于观察次数:
> result3 <- ampute(X, prop = 0.0075, bycases = FALSE)
> result3$prop
#[1] 0.9
## that is 120x100x.0075= 90 < 100
这里我报一个简单的脚本来生成你需要的数据集
rm(list=ls())
library(mice)
#>
#> Caricamento pacchetto: 'mice'
#> Il seguente oggetto è mascherato da 'package:stats':
#>
#> filter
#> I seguenti oggetti sono mascherati da 'package:base':
#>
#> cbind, rbind
set.seed(221)
n <- 100
P <- 120
pstar <- 50
covmat <- toeplitz((P:1)/P)
npat <- 120
testdata <- MASS::mvrnorm(n = n, mu = rep(0, P), Sigma = covmat)
testdata <- as.data.frame(testdata)
myfreq <- .15 #.05 .25
mypatterns <- matrix(1, nrow = npat, ncol = P)
for(i in 1:npat){
idx <- sample(x = 1:pstar, size = myfreq * n, replace = F)
mypatterns[i,idx] <- 0
}
#mypatterns
result <- ampute(testdata, patterns = mypatterns)
md.pattern(result$amp)
由 reprex package (v2.0.1)
于 2021-11-19 创建
会话信息
sessioninfo::session_info()
#> ─ Session info ──────────────────────────────────────────────────────────────
#> hash: person bowing, person taking bath, vampire: medium-dark skin tone
#>
#> setting value
#> version R version 4.1.0 (2021-05-18)
#> os Ubuntu 20.04.2 LTS
#> system x86_64, linux-gnu
#> ui X11
#> language (EN)
#> collate it_IT.UTF-8
#> ctype it_IT.UTF-8
#> tz Europe/Rome
#> date 2021-11-19
#> pandoc 2.11.4 @ /usr/lib/rstudio/bin/pandoc/ (via rmarkdown)
#>
#> ─ Packages ───────────────────────────────────────────────────────────────────
#> package * version date (UTC) lib source
#> assertthat 0.2.1 2019-03-21 [1] CRAN (R 4.1.0)
#> backports 1.3.0 2021-10-27 [1] CRAN (R 4.1.0)
#> broom 0.7.10 2021-10-31 [1] CRAN (R 4.1.0)
#> cli 3.1.0 2021-10-27 [1] CRAN (R 4.1.0)
#> crayon 1.4.2 2021-10-29 [1] CRAN (R 4.1.0)
#> curl 4.3.2 2021-06-23 [1] CRAN (R 4.1.0)
#> DBI 1.1.1 2021-01-15 [1] CRAN (R 4.1.0)
#> digest 0.6.28 2021-09-23 [1] CRAN (R 4.1.0)
#> dplyr 1.0.7 2021-06-18 [1] CRAN (R 4.1.0)
#> ellipsis 0.3.2 2021-04-29 [1] CRAN (R 4.1.0)
#> evaluate 0.14 2019-05-28 [1] CRAN (R 4.1.0)
#> fansi 0.5.0 2021-05-25 [1] CRAN (R 4.1.0)
#> fastmap 1.1.0 2021-01-25 [1] CRAN (R 4.1.0)
#> fs 1.5.0 2020-07-31 [1] CRAN (R 4.1.0)
#> generics 0.1.1 2021-10-25 [1] CRAN (R 4.1.0)
#> glue 1.5.0 2021-11-07 [1] CRAN (R 4.1.0)
#> highr 0.9 2021-04-16 [1] CRAN (R 4.1.0)
#> htmltools 0.5.2 2021-08-25 [1] CRAN (R 4.1.0)
#> httr 1.4.2 2020-07-20 [1] CRAN (R 4.1.0)
#> knitr 1.36 2021-09-29 [1] CRAN (R 4.1.0)
#> lattice 0.20-44 2021-05-02 [4] CRAN (R 4.1.0)
#> lifecycle 1.0.1 2021-09-24 [1] CRAN (R 4.1.0)
#> magrittr 2.0.1 2020-11-17 [1] CRAN (R 4.1.0)
#> MASS 7.3-54 2021-05-03 [4] CRAN (R 4.0.5)
#> mice * 3.13.0 2021-01-27 [1] CRAN (R 4.1.0)
#> mime 0.12 2021-09-28 [1] CRAN (R 4.1.0)
#> pillar 1.6.4 2021-10-18 [1] CRAN (R 4.1.0)
#> pkgconfig 2.0.3 2019-09-22 [1] CRAN (R 4.1.0)
#> purrr 0.3.4 2020-04-17 [1] CRAN (R 4.1.0)
#> R.cache 0.15.0 2021-04-30 [1] CRAN (R 4.1.0)
#> R.methodsS3 1.8.1 2020-08-26 [1] CRAN (R 4.1.0)
#> R.oo 1.24.0 2020-08-26 [1] CRAN (R 4.1.0)
#> R.utils 2.11.0 2021-09-26 [1] CRAN (R 4.1.0)
#> R6 2.5.1 2021-08-19 [1] CRAN (R 4.1.0)
#> Rcpp 1.0.7 2021-07-07 [1] CRAN (R 4.1.0)
#> reprex 2.0.1 2021-08-05 [1] CRAN (R 4.1.0)
#> rlang 0.4.12 2021-10-18 [1] CRAN (R 4.1.0)
#> rmarkdown 2.11 2021-09-14 [1] CRAN (R 4.1.0)
#> rstudioapi 0.13 2020-11-12 [1] CRAN (R 4.1.0)
#> sessioninfo 1.2.1 2021-11-02 [1] CRAN (R 4.1.0)
#> stringi 1.7.5 2021-10-04 [1] CRAN (R 4.1.0)
#> stringr 1.4.0 2019-02-10 [1] CRAN (R 4.1.0)
#> styler 1.6.2 2021-09-23 [1] CRAN (R 4.1.0)
#> tibble 3.1.6 2021-11-07 [1] CRAN (R 4.1.0)
#> tidyr 1.1.4 2021-09-27 [1] CRAN (R 4.1.0)
#> tidyselect 1.1.1 2021-04-30 [1] CRAN (R 4.1.0)
#> utf8 1.2.2 2021-07-24 [1] CRAN (R 4.1.0)
#> vctrs 0.3.8 2021-04-29 [1] CRAN (R 4.1.0)
#> withr 2.4.2 2021-04-18 [1] CRAN (R 4.1.0)
#> xfun 0.28 2021-11-04 [1] CRAN (R 4.1.0)
#> xml2 1.3.2 2020-04-23 [1] CRAN (R 4.1.0)
#> yaml 2.2.1 2020-02-01 [1] CRAN (R 4.1.0)
#>
#> [1] /home/matt/R/x86_64-pc-linux-gnu-library/4.1
#> [2] /usr/local/lib/R/site-library
#> [3] /usr/lib/R/site-library
#> [4] /usr/lib/R/library
#>
#> ──────────────────────────────────────────────────────────────────────────────
在R程序中,我将使用以下代码生成高维数据集,并使用MAR、MCAR和MNAR机制创建缺失数据集,缺失率分别为5%、25%和40%:
generateData<- function(n,p) {
sigma <- diag(p)
sigma <- replace(sigma, sigma == 0, 0.3)
mu= rep(0,nrow(sigma))
X <- mvrnorm(n, mu = mu, Sigma = sigma)
vCoef = rnorm(ncol(X))
vProb =exp(X%*%vCoef)/(1+exp(X%*%vCoef))
Y <- rbinom(nrow(X), 1, vProb)
data= data.frame(cbind(X,Y))
return(data)
}
data <- generateData(n = 100,p=120)
X <- data[-ncol(data)]
Y <- data[ncol(data)]
接下来我将比较插补方法的性能。我尝试使用 ampute 函数生成缺失的数据集,但是当我 运行 代码时出现以下错误,我认为这与模式和权重有关:
result <- ampute(X, prop = 0.4, mech ='MAR', type="RIGHT", bycases=FALSE)
Error: Proportion of missing cells is too large in combination with the desired number of missing variables
在使用截肢功能时,我无法对模式和重量进行必要的调整。我为 MAR、MCAR 和 MNAR 尝试了各种模式和权重值,但没有用。另外,我不知道是否有必要使用所有变量或仅使用部分变量(例如,前 50 个变量)来创建缺失数据集来创建缺失数据集。 作为插补方法,我将使用 EM、KNN、随机森林、基于回归的方法、朴素贝叶斯、人工神经网络以及经典方法。我可以通过对截肢功能进行必要的调整来使用它还是应该使用其他功能?预先感谢您的帮助。
I think you should provide a MWE in order to reproduce your error. Since I don't know what mypattern is like, I can't help you!
感谢您的回答!尽管我尝试了不同的模式,但每次都出现相同的错误。例如,我尝试使用如下所示的模式在前 50 个变量中创建缺失数据:
############### PATTERN ###########################
a <- ncol(X)
b <- 50
mypattern <- matrix(rep(1, a*b), ncol=a, nrow=b)
for(i in 1:b) {
mypattern[i,i] = 0
}
默认情况下创建模式时问题仍然存在。我将上面的代码更新为默认模式。
由于您正在编辑一些缺失的交叉引用,我删除了我的旧答案(应该是评论)并试图在此处完成并总结我的答案。
我认为这里的问题是由于误用了参数 bycases
。事实上,如果它设置为 FALSE
,prop
参数定义数据框中缺失条目的比例。如果您设置 prop = .4
,给定数据框的维度(120,000 个条目)和默认模式(其中缺失仅在一个变量上),您要求一个数据框在一个变量上有 4800 个缺失值(有 100 个条目)。
如果考虑以个案来定义缺失的比例
data <- generateData(n = 100, p=120)
X <- data[-ncol(data)]
Y <- data[ncol(data)]
result2 <- ampute(X, prop = 0.4)
result2$prop
#[1] 0.4
没有错误发生,因为您需要 40 个观察值(总计 100 个)在一个变量上有缺失值(因为我们仍在使用默认模式)。
如果你想考虑 bycases = FALSE
你应该定义一个模式来导致多个变量缺失,或者设置一个比例,使得单个协变量的缺失值数量小于观察次数:
> result3 <- ampute(X, prop = 0.0075, bycases = FALSE)
> result3$prop
#[1] 0.9
## that is 120x100x.0075= 90 < 100
这里我报一个简单的脚本来生成你需要的数据集
rm(list=ls())
library(mice)
#>
#> Caricamento pacchetto: 'mice'
#> Il seguente oggetto è mascherato da 'package:stats':
#>
#> filter
#> I seguenti oggetti sono mascherati da 'package:base':
#>
#> cbind, rbind
set.seed(221)
n <- 100
P <- 120
pstar <- 50
covmat <- toeplitz((P:1)/P)
npat <- 120
testdata <- MASS::mvrnorm(n = n, mu = rep(0, P), Sigma = covmat)
testdata <- as.data.frame(testdata)
myfreq <- .15 #.05 .25
mypatterns <- matrix(1, nrow = npat, ncol = P)
for(i in 1:npat){
idx <- sample(x = 1:pstar, size = myfreq * n, replace = F)
mypatterns[i,idx] <- 0
}
#mypatterns
result <- ampute(testdata, patterns = mypatterns)
md.pattern(result$amp)
由 reprex package (v2.0.1)
于 2021-11-19 创建 会话信息sessioninfo::session_info()
#> ─ Session info ──────────────────────────────────────────────────────────────
#> hash: person bowing, person taking bath, vampire: medium-dark skin tone
#>
#> setting value
#> version R version 4.1.0 (2021-05-18)
#> os Ubuntu 20.04.2 LTS
#> system x86_64, linux-gnu
#> ui X11
#> language (EN)
#> collate it_IT.UTF-8
#> ctype it_IT.UTF-8
#> tz Europe/Rome
#> date 2021-11-19
#> pandoc 2.11.4 @ /usr/lib/rstudio/bin/pandoc/ (via rmarkdown)
#>
#> ─ Packages ───────────────────────────────────────────────────────────────────
#> package * version date (UTC) lib source
#> assertthat 0.2.1 2019-03-21 [1] CRAN (R 4.1.0)
#> backports 1.3.0 2021-10-27 [1] CRAN (R 4.1.0)
#> broom 0.7.10 2021-10-31 [1] CRAN (R 4.1.0)
#> cli 3.1.0 2021-10-27 [1] CRAN (R 4.1.0)
#> crayon 1.4.2 2021-10-29 [1] CRAN (R 4.1.0)
#> curl 4.3.2 2021-06-23 [1] CRAN (R 4.1.0)
#> DBI 1.1.1 2021-01-15 [1] CRAN (R 4.1.0)
#> digest 0.6.28 2021-09-23 [1] CRAN (R 4.1.0)
#> dplyr 1.0.7 2021-06-18 [1] CRAN (R 4.1.0)
#> ellipsis 0.3.2 2021-04-29 [1] CRAN (R 4.1.0)
#> evaluate 0.14 2019-05-28 [1] CRAN (R 4.1.0)
#> fansi 0.5.0 2021-05-25 [1] CRAN (R 4.1.0)
#> fastmap 1.1.0 2021-01-25 [1] CRAN (R 4.1.0)
#> fs 1.5.0 2020-07-31 [1] CRAN (R 4.1.0)
#> generics 0.1.1 2021-10-25 [1] CRAN (R 4.1.0)
#> glue 1.5.0 2021-11-07 [1] CRAN (R 4.1.0)
#> highr 0.9 2021-04-16 [1] CRAN (R 4.1.0)
#> htmltools 0.5.2 2021-08-25 [1] CRAN (R 4.1.0)
#> httr 1.4.2 2020-07-20 [1] CRAN (R 4.1.0)
#> knitr 1.36 2021-09-29 [1] CRAN (R 4.1.0)
#> lattice 0.20-44 2021-05-02 [4] CRAN (R 4.1.0)
#> lifecycle 1.0.1 2021-09-24 [1] CRAN (R 4.1.0)
#> magrittr 2.0.1 2020-11-17 [1] CRAN (R 4.1.0)
#> MASS 7.3-54 2021-05-03 [4] CRAN (R 4.0.5)
#> mice * 3.13.0 2021-01-27 [1] CRAN (R 4.1.0)
#> mime 0.12 2021-09-28 [1] CRAN (R 4.1.0)
#> pillar 1.6.4 2021-10-18 [1] CRAN (R 4.1.0)
#> pkgconfig 2.0.3 2019-09-22 [1] CRAN (R 4.1.0)
#> purrr 0.3.4 2020-04-17 [1] CRAN (R 4.1.0)
#> R.cache 0.15.0 2021-04-30 [1] CRAN (R 4.1.0)
#> R.methodsS3 1.8.1 2020-08-26 [1] CRAN (R 4.1.0)
#> R.oo 1.24.0 2020-08-26 [1] CRAN (R 4.1.0)
#> R.utils 2.11.0 2021-09-26 [1] CRAN (R 4.1.0)
#> R6 2.5.1 2021-08-19 [1] CRAN (R 4.1.0)
#> Rcpp 1.0.7 2021-07-07 [1] CRAN (R 4.1.0)
#> reprex 2.0.1 2021-08-05 [1] CRAN (R 4.1.0)
#> rlang 0.4.12 2021-10-18 [1] CRAN (R 4.1.0)
#> rmarkdown 2.11 2021-09-14 [1] CRAN (R 4.1.0)
#> rstudioapi 0.13 2020-11-12 [1] CRAN (R 4.1.0)
#> sessioninfo 1.2.1 2021-11-02 [1] CRAN (R 4.1.0)
#> stringi 1.7.5 2021-10-04 [1] CRAN (R 4.1.0)
#> stringr 1.4.0 2019-02-10 [1] CRAN (R 4.1.0)
#> styler 1.6.2 2021-09-23 [1] CRAN (R 4.1.0)
#> tibble 3.1.6 2021-11-07 [1] CRAN (R 4.1.0)
#> tidyr 1.1.4 2021-09-27 [1] CRAN (R 4.1.0)
#> tidyselect 1.1.1 2021-04-30 [1] CRAN (R 4.1.0)
#> utf8 1.2.2 2021-07-24 [1] CRAN (R 4.1.0)
#> vctrs 0.3.8 2021-04-29 [1] CRAN (R 4.1.0)
#> withr 2.4.2 2021-04-18 [1] CRAN (R 4.1.0)
#> xfun 0.28 2021-11-04 [1] CRAN (R 4.1.0)
#> xml2 1.3.2 2020-04-23 [1] CRAN (R 4.1.0)
#> yaml 2.2.1 2020-02-01 [1] CRAN (R 4.1.0)
#>
#> [1] /home/matt/R/x86_64-pc-linux-gnu-library/4.1
#> [2] /usr/local/lib/R/site-library
#> [3] /usr/lib/R/site-library
#> [4] /usr/lib/R/library
#>
#> ──────────────────────────────────────────────────────────────────────────────