imputess {deducorrect} | R Documentation |
Impute values from solution space
Description
Given a record with observerd
and missing values
under
linear equality constraints
. The function
solSpace
returns
the solution space which can be written as , where
is
are a constant vector (of dimension d=
length
) and
a constant
matrix of dimension
.
Usage
imputess(x, x0, C, z = NULL, tol = sqrt(.Machine$double.eps))
Arguments
x |
(named) numerical vector to be imputed |
x0 |
|
C |
|
z |
real vector of dimension |
tol |
tolerance used to check which rows of |
Details
If has rows equal to zero, then those missing values may be imputed deductively.
For the other missing values, some
must be chosen or another imputation method
used.
The function imputess
imputes missing values in a vector , based on the
solution space and some chosen vector
. If no
is passed as argument, only
deductive imputations are performend (i.e. some missings may be left).
If is a named matrix (as returned by
solSpace
), rows of and
are matched by name to
. Otherwise it is assumed that the missings in
occur in the order
of the rows in
(which is also the case when x0 and C are computed by
solSpace
).
Examples
#############################################
# IMPUTATION OF NUMERIC DATA
#############################################
# These examples are taken from De Waal et al (2011) (Examples 9.1-9.2)
E <- editmatrix(c(
"x1 + x2 == x3",
"x2 == x4",
"x5 + x6 + x7 == x8",
"x3 + x8 == x9",
"x9 - x10 == x11",
"x6 >= 0",
"x7 >= 0"
))
dat <- data.frame(
x1=c(145,145),
x2=c(NA,NA),
x3=c(155,155),
x4=c(NA,NA),
x5=c(NA, 86),
x6=c(NA,NA),
x7=c(NA,NA),
x8=c(86,86),
x9=c(NA,NA),
x10=c(217,217),
x11=c(NA,NA)
)
dat
d <- deduImpute(E,dat)
d$corrected
d$status
d$corrections
#############################################
# IMPUTATION OF CATEGORICAL DATA
#############################################
# Here's an example from Katrika (2001) [but see De Waal et al (2011), ex. 9.3)]
E <- editarray(c(
"x1 \%in\% letters[1:4]",
"x2 \%in\% letters[1:3]",
"x3 \%in\% letters[1:3]",
"x4 \%in\% letters[1:2]",
"if (x2 == 'c' & x3 != 'c' & x4 == 'a' ) FALSE",
"if (x2 != 'a' & x4 == 'b') FALSE",
"if (x1 != 'c' & x2 != 'b' & x3 != 'a') FALSE",
"if (x1 == 'c' & x3 != 'a' & x4 == 'a' ) FALSE"
))
dat <- data.frame(
x1 = c('c', NA ),
x2 = c('b', NA ),
x3 = c(NA , NA ),
x4 = c(NA , 'b'),
stringsAsFactors=FALSE)
s <- deduImpute(E,dat)
s$corrected
s$status
s$corrections
E <- editset(expression(
x + y == z,
x >= 0,
A %in% c('a','b'),
B %in% c('c','d'),
if ( A == 'a' ) B == 'b',
if ( B == 'b' ) x > 0
))
x <- data.frame(
x = NA,
y = 1,
z = 1,
A = 'a',
B = NA
)
# deduImpute will impute x=0 and B='b',which violates the
# last edit. Hence, imputation will be reverted.
deduImpute(E,x)