R/methods_survey.R

Defines functions sanitize_model_specific.svyolr get_predict.svyglm get_predict.svyolr get_group_names.svyolr set_coef.svyolr get_coef.svyolr

Documented in get_coef.svyolr get_group_names.svyolr get_predict.svyglm get_predict.svyolr sanitize_model_specific.svyolr set_coef.svyolr

#' @include get_coef.R
#' @rdname get_coef
#' @export
get_coef.svyolr <- function(model, ...) {
    out <- insight::get_parameters(model)
    out <- stats::setNames(out$Estimate, out$Parameter)

    return(out)
}

#' @include set_coef.R
#' @rdname set_coef
#' @export

set_coef.svyolr <- function(model, coefs, ...) {
    # in basic model classes coefficients are named vector
    idx <- match(names(model$coefficients), names(coefs))
    model[["coefficients"]] <- coefs[idx]
    idx <- match(names(model$zeta), names(coefs))
    model[["zeta"]] <- coefs[idx]
    model
}

#' @include get_group_names.R
#' @rdname get_group_names
#' @export
get_group_names.svyolr <- function(model, ...) {
    resp <- insight::get_response(model)
    if (is.factor(resp)) {
        out <- levels(resp)
    } else {
        out <- unique(resp)
    }
    return(out)
}

#' @include get_predict.R
#' @rdname get_predict
#' @export
get_predict.svyolr <- function(
    model,
    newdata = insight::get_data(model),
    type = "probs",
    ...
) {
    type <- sanitize_type(model, type, calling_function = "predictions")

    # hack: 1-row newdata returns a vector, so get_predict.default does not learn about groups
    if (nrow(newdata) == 1) {
        hack <- TRUE
        newdata <- newdata[c(1, 1), , drop = FALSE]
        newdata$rowid[1] <- -Inf
    } else {
        hack <- FALSE
    }

    out <- get_predict.default(model, newdata = newdata, type = type, ...)

    # hack
    out <- out[out$rowid != -Inf, ]

    return(out)
}


#' @include get_predict.R
#' @rdname get_predict
#' @export
get_predict.svyglm <- function(
    model,
    newdata = insight::get_data(model),
    type = "response",
    se.fit = FALSE,
    ...
) {
    estimate <- stats::predict(
        model,
        newdata = newdata,
        type = type,
        se.fit = se.fit
    )
    rowid <- attr(estimate, "names")

    # useless integer index creates problems: Issue #1161
    if (identical(suppressWarnings(as.integer(rowid)), seq_len(nrow(newdata)))) {
        rowid <- NULL
    }

    if (is.null(rowid) && "rowid" %in% colnames(newdata)) {
        rowid <- newdata[["rowid"]]
    } else if (is.null(rowid)) {
        rowid <- seq_len(estimate)
    } else {
        # rowid might be character, but survey::predict() requires non-negative integers
        rowid <- seq_along(rowid)
    }
    out <- data.frame(rowid, estimate = as.numeric(estimate))
    row.names(out) <- NULL
    return(out)
}


#' @include sanity_model.R
#' @rdname sanitize_model_specific
#' @export
sanitize_model_specific.svyolr <- function(
    model,
    wts = FALSE,
    by = FALSE,
    ...
) {
    if (isFALSE(wts) && !isFALSE(by)) {
        warning(
            "With models of this class, it is normally good practice to specify weights using the `wts` argument. Otherwise, weights will be ignored in the computation of quantities of interest.",
            call. = FALSE
        )
    }
    return(model)
}


#' @include sanity_model.R
#' @rdname sanitize_model_specific
#' @export
sanitize_model_specific.svyglm <- sanitize_model_specific.svyolr

Try the marginaleffects package in your browser

Any scripts or data that you put into this service are public.

marginaleffects documentation built on June 8, 2025, 12:44 p.m.