Ich sehe oft Leute (Statistiker und Praktiker), die Variablen ohne einen zweiten Gedanken transformieren. Ich hatte immer Angst vor Transformationen, weil ich befürchte, dass sie die Fehlerverteilung ändern und somit zu ungültigen Schlussfolgerungen führen könnten, aber es ist so häufig, dass ich etwas falsch verstehen muss.
Angenommen, ich habe ein Modell, um Ideen zu korrigieren
Dies könnte im Prinzip von NLS angepasst werden. Fast immer sehe ich jedoch Leute, die Protokolle nehmen und passen
Ich weiß, dass dies von OLS angepasst werden kann, aber ich weiß nicht, wie ich die Konfidenzintervalle für die Parameter berechnen soll, geschweige denn Vorhersageintervalle oder Toleranzintervalle.
Und das war ein sehr einfacher Fall: Betrachten Sie diesen (für mich) wesentlich komplexeren Fall, in dem ich nicht die Form der Beziehung zwischen und a priori annehme , sondern versuche, sie aus Daten abzuleiten, z. ein GAM. Betrachten wir die folgenden Daten:
library(readr)
library(dplyr)
library(ggplot2)
# data
device <- structure(list(Amplification = c(1.00644, 1.00861, 1.00936, 1.00944,
1.01111, 1.01291, 1.01369, 1.01552, 1.01963, 1.02396, 1.03016,
1.03911, 1.04861, 1.0753, 1.11572, 1.1728, 1.2512, 1.35919, 1.50447,
1.69446, 1.94737, 2.26728, 2.66248, 3.14672, 3.74638, 4.48604,
5.40735, 6.56322, 8.01865, 9.8788, 12.2692, 15.3878, 19.535,
20.5192, 21.5678, 22.6852, 23.8745, 25.1438, 26.5022, 27.9537,
29.5101, 31.184, 32.9943, 34.9456, 37.0535, 39.325, 41.7975,
44.5037, 47.466, 50.7181, 54.2794, 58.2247, 62.6346, 67.5392,
73.0477, 79.2657, 86.3285, 94.4213, 103.781, 114.723, 127.637,
143.129, 162.01, 185.551, 215.704, 255.635, 310.876, 392.231,
523.313, 768.967, 1388.19, 4882.47), Voltage = c(34.7732, 24.7936,
39.7788, 44.7776, 49.7758, 54.7784, 64.778, 74.775, 79.7739,
84.7738, 89.7723, 94.772, 99.772, 109.774, 119.777, 129.784,
139.789, 149.79, 159.784, 169.772, 179.758, 189.749, 199.743,
209.736, 219.749, 229.755, 239.762, 249.766, 259.771, 269.775,
279.778, 289.781, 299.783, 301.783, 303.782, 305.781, 307.781,
309.781, 311.781, 313.781, 315.78, 317.781, 319.78, 321.78, 323.78,
325.78, 327.779, 329.78, 331.78, 333.781, 335.773, 337.774, 339.781,
341.783, 343.783, 345.783, 347.783, 349.785, 351.785, 353.786,
355.786, 357.787, 359.786, 361.787, 363.787, 365.788, 367.79,
369.792, 371.792, 373.794, 375.797, 377.8)), .Names = c("Amplification",
"Voltage"), row.names = c(NA, -72L), class = "data.frame")
Wenn ich die Daten ohne logarithmische Transformation von , sehen das resultierende Modell und die Vertrauensgrenzen nicht so gut aus:
# build model
model <- gam(Voltage ~ s(Amplification, sp = 0.001), data = device)
# compute predictions with standard errors and rename columns to make plotting simpler
Amplifications <- data.frame(Amplification = seq(min(APD_data$Amplification),
max(APD_data$Amplification), length.out = 500))
predictions <- predict.gam(model, Amplifications, se.fit = TRUE)
predictions <- cbind(Amplifications, predictions)
predictions <- rename(predictions, Voltage = fit)
# plot data, model and standard errors
ggplot(device, aes(x = Amplification, y = Voltage)) +
geom_point() +
geom_ribbon(data = predictions,
aes(ymin = Voltage - 1.96*se.fit, ymax = Voltage + 1.96*se.fit),
fill = "grey70", alpha = 0.5) +
geom_line(data = predictions, color = "blue")
Aber wenn ich nur logarithmisch transformiere , scheinen die Vertrauensgrenzen für viel kleiner zu werden:
log_model <- gam(Voltage ~ s(log(Amplification)), data = device)
# the rest of the code stays the same, except for log_model in place of model
Offensichtlich ist etwas faul. Sind diese Konfidenzintervalle zuverlässig? BEARBEITEN Dies ist nicht einfach ein Problem des Glättungsgrades, wie es in einer Antwort vorgeschlagen wurde. Ohne die Protokolltransformation ist der Glättungsparameter
> model$sp
s(Amplification)
5.03049e-07
Mit der Log-Transformation ist der Glättungsparameter tatsächlich viel größer:
>log_model$sp
s(log(Amplification))
0.0005156608
Dies ist jedoch nicht der Grund, warum die Konfidenzintervalle so klein werden. In der Tat werden durch die Verwendung eines noch größeren Glättungsparameters sp = 0.001
unter Vermeidung jeglicher Protokolltransformation die Oszillationen reduziert (wie im Fall der Protokolltransformation), aber die Standardfehler sind in Bezug auf den Fall der Protokolltransformation immer noch sehr groß:
smooth_model <- gam(Voltage ~ s(Amplification, sp = 0.001), data = device)
# the rest of the code stays the same, except for smooth_model in place of model
Was passiert im Allgemeinen mit den Konfidenzintervallen , wenn ich die Transformation und / oder protokolliere ? Wenn es im allgemeinen Fall nicht möglich ist, quantitativ zu antworten, akzeptiere ich eine Antwort, die für den ersten Fall (das Exponentialmodell) quantitativ ist (dh eine Formel zeigt) und für den zweiten Fall mindestens ein handwedelndes Argument liefert (GAM-Modell).
mgcv
als eine Summe von Begriffen vom Typ - ich kann sie ausprobieren. Was ist Voung's Test? Können Sie weitere Details angeben? Wissen Sie, ob es in einem R-Paket implementiert ist?Antworten:
Sie sehen ein Klingeln, das das Ergebnis des Durchlaufens einer Hochfrequenzänderung, dh einer Schrittfunktion, durch ein Tiefpassfilter, dh das GAM, ist.
Wenn Sie die Protokolltransformation anwenden, ändern Sie den Gradienten des nahezu vertikalen Abschnitts des Diagramms auf der linken Seite so, dass er etwas weniger steil ist, weniger implizite hohe Frequenzen aufweist und der Klingeleffekt verschwindet.
Bearbeiten: einige Bilder vom Klingeln hier: /electronics/79717/what-can-reduce-overshoot-and-ringing-on-a-simple-square-wave-pulse-generator
Edit2: Beachten Sie, dass eine zunehmende Glättung das Klingeln erhöhen würde , da die Glättung im Wesentlichen das Tiefpassfilter ist, das das Klingeln verursacht. Was das Klingeln reduzieren würde, wäre zum Beispiel: 1. Entfernen Sie die Punkte in der ansteigenden Klippenkante links und passen Sie sie wieder an, oder 2. Reduzieren Sie die Glättung oder 3. Reduzieren Sie die Frequenz / erhöhen Sie die Wellenlänge / erhöhen Sie die Grenzfrequenz der Glättung .
Sie können sehen, dass der Rest des Diagramms mehr oder weniger geradlinig ist, wenn Sie das Klippenbit entfernen. Warum passt das GAM also eine Sinuswelle durch diese Punkte? Dies liegt ausschließlich daran, dass der Teil mit den Klippen einen sehr hohen Gradienten erzwingt, der dann zu einem nachfolgenden Überschwingen führt.
Edit3: Wenn ich es wäre, würde ich versuchen, eine Transformation zu finden, die den Graphen in eine ungefähr gerade Linie verwandelt. Ich bin mir nicht ganz sicher, wie diese Transformation aussehen würde, aber es sieht so aus, als wäre der Graph fast eine flache Linie, asymptotisch für ~ 380 oder so. Dies ist eine stärkere Nichtlinearität als zB
log
, die flach wird, aber nicht ganz so schnell, denke ich. Vielleicht so etwas wie ein inverses Sigmoid? Sigmoid ist:... und sieht aus wie (aus Wikipedia https://en.wikipedia.org/wiki/Sigmoid_function )
Inverses Sigmoid ist die
logit
Funktion, https://en.wikipedia.org/wiki/Logit :Vielleicht könnte eine damit verbundene Transformation oder eine parametrisierte Version davon den Graphen näher an eine gerade Linie bringen und somit für statistische Standardtechniken zugänglicher sein?
quelle
gam
ihn durch Kreuzvalidierung auswählen zu lassen. Interessant: Ich werde das testen. Ich schätze die Einsicht (+1), aber sie beantwortet nicht die ursprüngliche Frage nach der Auswirkung von Log-Transformationen auf die Konfidenzintervalle.logit
um den Graphen in etwas zu verwandeln, das näher an einer geraden Linie liegt