3

答えが明らかな場合は申し訳ありませんが、mgcv.gam でカスタム リンク関数を使用するのにかなりの時間を費やしました。

要するに、

  • パッケージpsyphyから変更された probit リンクを使用したい (使用したいpsyphy.probit_2asym、私はそれを呼び出しますcustom_link)
  • このリンクを使用して {stats} family オブジェクトを作成し、それを glm の「family」引数で使用できます。

    m <- glm(y~x, family=binomial(link=custom_link), ... )

  • {mgcv}gam の引数として使用すると動作しません

    m <- gam(y~s(x), family=binomial(link=custom_link), ... )

    エラーが発生しますError in fix.family.link.family(family) : link not recognised

このエラーの理由はわかりません。標準を指定すると、glm と gam の両方が機能しますlink=probit

したがって、私の質問は次のように要約できます。

glm では機能するが gam では機能しないこのカスタム リンクには何が欠けていますか?

私が何をすべきかについてのヒントを教えていただければ、事前に感謝します。


リンク機能

probit.2asym <- function(g, lam) {
    if ((g < 0 ) || (g > 1))
        stop("g must in (0, 1)")
    if ((lam < 0) || (lam > 1))
        stop("lam outside (0, 1)")
    linkfun <- function(mu) {
        mu <- pmin(mu, 1 - (lam + .Machine$double.eps))
        mu <- pmax(mu, g + .Machine$double.eps)
        qnorm((mu - g)/(1 - g - lam))
        }
    linkinv <- function(eta) {
        g + (1 - g - lam) * 
         pnorm(eta)
        }
    mu.eta <- function(eta) {
        (1 - g - lam) * dnorm(eta)      }
    valideta <- function(eta) TRUE
    link <- paste("probit.2asym(", g, ", ", lam, ")", sep = "")
    structure(list(linkfun = linkfun, linkinv = linkinv, 
    mu.eta = mu.eta, valideta = valideta, name = link), 
    class = "link-glm")
}
4

1 に答える 1