Nothing
# Ordinary least squares with generalized inverse from the ddml package
# See ?ddml::ols
ols <- function(y, X,
const = FALSE,
w = NULL) {
# Add constant (optional)
if (const) X <- cbind(1, X)
# Data parameters
calc_wls <- !is.null(w)
# Compute OLS coefficient
if (!calc_wls) {
XX_inv <- csolve(as.matrix(Matrix::crossprod(X)))
coef <- XX_inv %*% Matrix::crossprod(X, y)
} else { # Or calculate WLS coefficient whenever weights are specified
Xw <- X * w # weight rows
XX_inv <- csolve(as.matrix(Matrix::crossprod(Xw, X)))
coef <- XX_inv %*% Matrix::crossprod(Xw, y)
}#IFELSE
# Return estimate
coef <- as.matrix(coef)
try(rownames(coef) <- colnames(X)) # assign coefficient names
output <- list(coef = coef, y = y, X = X,
const = const, w = w)
class(output) <- "ols" # define S3 class
return(output)
}#OLS
# Complementary methods ========================================================
# Constructed fitted values
predict.ols <- function(object, newdata = NULL, ...){
# Obtain datamatrix
if (is.null(newdata)) {
newdata <- object$X
} else if (object$const) {
newdata <- cbind(1, newdata)
}#IFELSE
# Calculate and return fitted values with the OLS coefficient
fitted <- newdata%*%object$coef
return(fitted)
}#PREDICT.OLS
# help function for generalized inverse ========================================
# Simple generalized inverse wrapper.
csolve <- function(X) {
# Attempt inversion
X_inv <- tryCatch(solve(X), error = function(e) NA)
# If inversion failed, calculate generalized inverse
if (any(is.na(X_inv))) {
X_inv <- MASS::ginv(X)
}#IF
# Return (generalized) inverse
return(X_inv)
}#CSOLVE
Any scripts or data that you put into this service are public.
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.