@NickCox hat eine gute Möglichkeit zur Visualisierung Ihrer Daten vorgestellt. Ich nehme an, Sie möchten eine Regel finden, mit der Sie entscheiden können, wann ein Wert als Bedingung1 oder Bedingung2 klassifiziert werden soll.
In einer früheren Version Ihrer Frage haben Sie sich gefragt, ob Sie als Mitglied von Bedingung2 einen Wert nennen sollten, der größer als der Median von Bedingung1 ist. Dies ist keine gute Regel. Beachten Sie, dass per Definition einer Verteilung über dem Median liegen. Daher werden Sie notwendigerweise der Mitglieder von true condition1 falsch klassifizieren . Ich gehe davon aus, dass Sie aufgrund Ihrer Daten auch Ihrer Mitglieder von true condition2 falsch klassifizieren werden . 50 %50 %18 %
Eine Möglichkeit, den Wert einer Regel wie Ihrer zu überdenken, besteht darin, eine Verwirrungsmatrix zu bilden . In R können Sie ? ConfusionMatrix im Caret-Paket verwenden . Hier ist ein Beispiel mit Ihren Daten und Ihrer vorgeschlagenen Regel:
library(caret)
dat = stack(list(cond1=Cond.1, cond2=Cond.2))
pred = ifelse(dat$values>median(Cond.1), "cond2", "cond1")
confusionMatrix(pred, dat$ind)
# Confusion Matrix and Statistics
#
# Reference
# Prediction cond1 cond2
# cond1 20 7
# cond2 19 32
#
# Accuracy : 0.6667
# ...
#
# Sensitivity : 0.5128
# Specificity : 0.8205
# Pos Pred Value : 0.7407
# Neg Pred Value : 0.6275
# Prevalence : 0.5000
# Detection Rate : 0.2564
# Detection Prevalence : 0.3462
# Balanced Accuracy : 0.6667
Ich wette, wir können es besser machen.
Ein natürlicher Ansatz besteht darin, ein CART- Modell ( Entscheidungsbaummodell ) zu verwenden, das (wenn nur eine Variable vorhanden ist) einfach die optimale Aufteilung findet. In R können Sie dies mit ? Ctree aus dem Party-Paket tun .
library(party)
cart.model = ctree(ind~values, dat)
windows()
plot(cart.model)
Sie können sehen, dass das Modell einen Wert "Bedingung1" , wenn es , und andernfalls "Bedingung2" (beachten Sie, dass der Median von Bedingung1 ). Hier ist die Verwirrungsmatrix: ≤ 5,73.9
confusionMatrix(predict(cart.model), dat$ind)
# Confusion Matrix and Statistics
#
# Reference
# Prediction cond1 cond2
# cond1 39 15
# cond2 0 24
#
# Accuracy : 0.8077
# ...
#
# Sensitivity : 1.0000
# Specificity : 0.6154
# Pos Pred Value : 0.7222
# Neg Pred Value : 1.0000
# Prevalence : 0.5000
# Detection Rate : 0.5000
# Detection Prevalence : 0.6923
# Balanced Accuracy : 0.8077
Diese Regel ergibt eine Genauigkeit von anstelle von . Aus dem Diagramm und der Verwirrungsmatrix können Sie ersehen, dass echte Mitglieder von Bedingung1 niemals als Bedingung2 falsch klassifiziert werden. Dies ergibt sich aus der Optimierung der Genauigkeit der Regel und der Annahme, dass beide Arten der Fehlklassifizierung gleich schlecht sind. Sie können den Modellanpassungsprozess optimieren, wenn dies nicht der Fall ist. 0,80770,6667
Andererseits wäre ich mir nicht sicher, wenn ich nicht darauf hinweisen würde, dass ein Klassifikator notwendigerweise viele Informationen wegwirft und normalerweise nicht optimal ist (es sei denn, Sie benötigen wirklich Klassifikationen). Möglicherweise möchten Sie die Daten so modellieren, dass Sie die Wahrscheinlichkeit erhalten, dass ein Wert Mitglied von Bedingung2 ist. Logistische Regression ist hier die natürliche Wahl. Beachten Sie, dass ich einen quadratischen Term hinzugefügt habe, um eine krummlinige Anpassung zu ermöglichen, da Ihre Bedingung2 viel weiter verteilt ist als Bedingung1:
lr.model = glm(ind~values+I(values^2), dat, family="binomial")
lr.preds = predict(lr.model, type="response")
ord = order(dat$values)
dat = dat[ord,]
lr.preds = lr.preds[ord]
windows()
with(dat, plot(values, ifelse(ind=="cond2",1,0),
ylab="predicted probability of condition2"))
lines(dat$values, lr.preds)
Dies gibt Ihnen eindeutig mehr und bessere Informationen. Es wird nicht empfohlen, die zusätzlichen Informationen in Ihren vorhergesagten Wahrscheinlichkeiten wegzuwerfen und sie in Klassifikationen zu dichotomisieren. Zum Vergleich mit den oben genannten Regeln kann ich Ihnen jedoch die Verwirrungsmatrix zeigen, die sich aus Ihrem logistischen Regressionsmodell ergibt:
lr.class = ifelse(lr.preds<.5, "cond1", "cond2")
confusionMatrix(lr.class, dat$ind)
# Confusion Matrix and Statistics
#
# Reference
# Prediction cond1 cond2
# cond1 36 8
# cond2 3 31
#
# Accuracy : 0.859
# ...
#
# Sensitivity : 0.9231
# Specificity : 0.7949
# Pos Pred Value : 0.8182
# Neg Pred Value : 0.9118
# Prevalence : 0.5000
# Detection Rate : 0.4615
# Detection Prevalence : 0.5641
# Balanced Accuracy : 0.8590
Die Genauigkeit beträgt jetzt anstelle von . 0,8590,8077