Reduce0exact | R Documentation |
The linear equation problem, z = t(x) %*% y
with y non-negative and x as a design (dummy) matrix,
is reduced to a smaller problem by identifying elements of y
that can be found exactly from x
and z
.
Reduce0exact(
x,
z = NULL,
reduceByColSums = FALSE,
reduceByLeverage = FALSE,
leverageLimit = 0.999999,
digitsRoundWhole = 9,
y = NULL,
yStart = NULL,
printInc = FALSE
)
x |
A matrix |
z |
A single column matrix |
reduceByColSums |
See Details |
reduceByLeverage |
See Details |
leverageLimit |
Limit to determine perfect fit |
digitsRoundWhole |
|
y |
A single column matrix. With |
yStart |
A starting estimate when this function is combined with iterative proportional fitting. Zeros in yStart will be used to reduce the problem. |
printInc |
Printing iteration information to console when TRUE |
Exact elements can be identified in three ways in an iterative manner:
By zeros in z
. This is always done.
By columns in x with a singe nonzero value. Done when reduceByColSums
or reduceByLeverage
is TRUE
.
By exact linear regression fit (when leverage is one). Done when reduceByLeverage
is TRUE
.
The leverages are computed by hat(as.matrix(x), intercept = FALSE)
, which can be very time and memory consuming.
Furthermore, without y
in input, known values will be computed by ginv
.
A list of five elements:
x
: A reduced version of input x
z
: Corresponding reduced z
yKnown
: Logical, specifying known values of y
y
: A version of y
with known values correct and others zero
zSkipped
: Logical, specifying omitted columns of x
Øyvind Langsrud
# Make a special data set
d <- SSBtoolsData("sprt_emp")
d$ths_per <- round(d$ths_per)
d <- rbind(d, d)
d$year <- as.character(rep(2014:2019, each = 6))
to0 <- rep(TRUE, 36)
to0[c(6, 14, 17, 18, 25, 27, 30, 34, 36)] <- FALSE
d$ths_per[to0] <- 0
# Values as a single column matrix
y <- Matrix(d$ths_per, ncol = 1)
# A model matrix using a special year hierarchy
x <- Hierarchies2ModelMatrix(d, hierarchies = list(geo = "", age = "", year =
c("y1418 = 2014+2015+2016+2017+2018", "y1519 = 2015+2016+2017+2018+2019",
"y151719 = 2015+2017+2019", "yTotal = 2014+2015+2016+2017+2018+2019")),
inputInOutput = FALSE)
# Aggregates
z <- t(x) %*% y
sum(z == 0) # 5 zeros
# From zeros in z
a <- Reduce0exact(x, z)
sum(a$yKnown) # 17 zeros in y is known
dim(a$x) # Reduced x, without known y and z with zeros
dim(a$z) # Corresponding reduced z
sum(a$zSkipped) # 5 elements skipped
t(a$y) # Just zeros (known are 0 and unknown set to 0)
# It seems that three additional y-values can be found directly from z
sum(colSums(a$x) == 1)
# But it is the same element of y (row 18)
a$x[18, colSums(a$x) == 1]
# Make use of ones in colSums
a2 <- Reduce0exact(x, z, reduceByColSums = TRUE)
sum(a2$yKnown) # 18 values in y is known
dim(a2$x) # Reduced x
dim(a2$z) # Corresponding reduced z
a2$y[which(a2$yKnown)] # The known values of y (unknown set to 0)
# Six ones in leverage values
# Thus six extra elements in y can be found by linear estimation
hat(as.matrix(a2$x), intercept = FALSE)
# Make use of ones in leverages (hat-values)
a3 <- Reduce0exact(x, z, reduceByLeverage = TRUE)
sum(a3$yKnown) # 26 values in y is known (more than 6 extra)
dim(a3$x) # Reduced x
dim(a3$z) # Corresponding reduced z
a3$y[which(a3$yKnown)] # The known values of y (unknown set to 0)
# More than 6 extra is caused by iteration
# Extra checking of zeros in z after reduction by leverages
# Similar checking performed also after reduction by colSums
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.