Was ist die Kostenfunktion in cv.glm im Boot-Paket von R?

14

Ich führe eine Kreuzvalidierung mit der Methode "Auslassen" durch. Ich habe eine binäre Antwort und benutze das Boot-Paket für R und die cv.glm-Funktion . Mein Problem ist, dass ich den Teil "Kosten" in dieser Funktion nicht vollständig verstehe. Nach meinem Verständnis ist dies die Funktion, die entscheidet, ob ein geschätzter Wert als 1 oder als 0 klassifiziert werden soll, dh der Schwellenwert für die Klassifizierung. Ist das richtig?

Und in der Hilfe in R sie verwenden diese Funktion für einen Binomialmodells: cost <- function(r, pi = 0) mean(abs(r-pi) > 0.5). Wie interpretiere ich diese Funktion? so kann ich es für meine Analyse richtig modifizieren.

Jede Hilfe wird gebeten, ich möchte keine Funktion verwenden, die ich nicht verstehe.

mael
quelle

Antworten:

9

r ist ein Vektor, der das tatsächliche Ergebnis enthält, pi ist ein Vektor, der die angepassten Werte enthält.

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

cost=|ripii|

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))
  }

und setzen Sie mycost als Argument in die Funktion cv.glm.

Feng Mai
quelle
cost
|ripi|0.5
|ripi|=112
@ Feng-Mai pi == 0 oder pi <0,5? (und pi == 1 oder pi> 0,5?), wenn 0,5 als Entscheidungsgrenze verwendet wird. Sind die pi nicht die vorhergesagten Wahrscheinlichkeiten ?
PM.
1
pi
1
cost <- function(r, pi = 0) mean(abs(r-pi) > 0.5)

Zunächst haben Sie einen Grenzwert von 0,5 festgelegt. Ihr r ist 0/1, aber pi ist Wahrscheinlichkeit. Die Einzelkosten sind also 1, wenn der absolute Fehler größer als 0,5 ist, andernfalls 0. Diese Funktion berechnet dann die durchschnittliche Fehlerrate. Denken Sie jedoch daran, dass der Grenzwert festgelegt wurde, bevor Sie Ihre Kostenfunktion definieren.

Eigentlich halte ich es für sinnvoller, wenn die Wahl des Cut-Offs durch die Kostenfunktion bestimmt wird.

SLi
quelle
0

Die Antwort von @SLi erklärt bereits sehr gut, was die von Ihnen definierte Kostenfunktion bewirkt. Ich dachte jedoch, ich würde hinzufügen, dass die Kostenfunktion verwendet wird, um den deltaWert zu berechnen cv.glm, der ein Maß für den Kreuzvalidierungsfehler ist. Kritisch deltaist jedoch der gewichtete Durchschnitt des Fehlers jeder Falte, der durch die Kosten gegeben ist. Wir sehen dies, indem wir das relevante Bit des Codes untersuchen:

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"))
}

und der von der Funktion zurückgegebene Wert ist:

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