Quelle est la fonction de coût dans cv.glm dans le package de démarrage de R?

14

Je fais une validation croisée en utilisant la méthode du congé-un. J'ai une réponse binaire et j'utilise le package de démarrage pour R et la fonction cv.glm . Mon problème est que je ne comprends pas bien la partie "coût" de cette fonction. D'après ce que je peux comprendre, c'est la fonction qui décide si une valeur estimée doit être classée en 1 ou en 0, c'est-à-dire la valeur seuil pour la classification. Est-ce correct?

Et, dans l'aide en R ils utilisent cette fonction pour un modèle binomial: cost <- function(r, pi = 0) mean(abs(r-pi) > 0.5). Comment interpréter cette fonction? afin que je puisse le modifier correctement pour mon analyse.

Toute aide est appréciée, je ne veux pas utiliser une fonction que je ne comprends pas.

mael
la source

Réponses:

9

r est un vecteur qui contient le résultat réel, pi est un vecteur qui contient les valeurs ajustées.

cost <- function(r, pi = 0) mean(abs(r-pi) > 0.5)

cost=|rje-pjeje|

mycost <- function(r, pi){
    weight1 = 1 #cost for getting 1 wrong
    weight0 = 1 #cost for getting 0 wrong
    c1 = (r==1)&(pi<0.5) #logical vector - true if actual 1 but predict 0
    c0 = (r==0)&(pi>=0.5) #logical vector - true if actual 0 but predict 1
    return(mean(weight1*c1+weight0*c0))
  }

et mettez mycost comme argument dans la fonction cv.glm.

Feng Mai
la source
cost
|rje-pje|0,5
|rje-pje|=112)?
Mooncrater
@ feng-mai pi == 0 ou pi <0,5? (et pi == 1 ou pi> 0,5?) si vous utilisez 0,5 comme limite de décision. Les pi ne sont-ils pas les probabilités prédites ?
PM.
1
@PM Oui, vous avez raison. pjesont les réponses du modèle glm. Merci pour la correction.
Feng Mai
1
cost <- function(r, pi = 0) mean(abs(r-pi) > 0.5)

Tout d'abord, vous avez défini un seuil de 0,5. Votre r est 0/1, mais pi est la probabilité. Le coût individuel est donc de 1 si l'erreur absolue est supérieure à 0,5, sinon 0. Ensuite, cette fonction calcule le taux d'erreur moyen. Mais rappelez-vous, le seuil a été défini avant de définir votre fonction de coût.

En fait, je pense que cela a plus de sens si le choix du seuil est déterminé par la fonction de coût.

SLi
la source
0

La réponse de @SLi explique déjà très bien ce que fait la fonction de coût que vous avez définie. Cependant, j'ai pensé ajouter que la fonction de coût est utilisée pour calculer la deltavaleur à partir de cv.glm, qui est une mesure de l'erreur de validation croisée. Cependant, deltala moyenne pondérée de l'erreur de chaque pli donnée par le coût est critique . Nous voyons cela en inspectant le bit pertinent du code:

for (i in seq_len(ms)) {
    j.out <- seq_len(n)[(s == i)]
    j.in <- seq_len(n)[(s != i)]
    Call$data <- data[j.in, , drop = FALSE]
    d.glm <- eval.parent(Call)
    p.alpha <- n.s[i]/n # create weighting for averaging later
    cost.i <- cost(glm.y[j.out], predict(d.glm, data[j.out, 
        , drop = FALSE], type = "response"))
    CV <- CV + p.alpha * cost.i # add previous error to running total
    cost.0 <- cost.0 - p.alpha * cost(glm.y, predict(d.glm, 
        data, type = "response"))
}

et la valeur retournée par la fonction est:

  list(call = call, K = K, delta = as.numeric(c(CV, CV + cost.0)), 
    seed = seed)
Alex
la source