Costumo ver pessoas (estatísticos e profissionais) transformando variáveis sem pensar duas vezes. Eu sempre tive medo de transformações, porque me preocupo que elas possam modificar a distribuição de erros e, assim, levar a inferência inválida, mas é tão comum que devo estar entendendo mal alguma coisa.
Para consertar idéias, suponha que eu tenha um modelo
Isso poderia, em princípio, ser adequado ao NLS. No entanto, quase sempre vejo pessoas pegando toras e ajustando
Eu sei que isso pode ser ajustado pelo OLS, mas não sei como calcular os intervalos de confiança nos parâmetros, agora, muito menos nos intervalos de previsão ou de tolerância.
E esse foi um caso muito simples: considere esse caso consideravelmente mais complexo (para mim) no qual não assumo a forma do relacionamento entre e a priori , mas tento inferir isso a partir de dados, com, por exemplo, um GAM. Vamos considerar os seguintes dados:
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")
Se plotar os dados sem transformar o log , o modelo resultante e os limites de confiança não parecerão tão agradáveis:
# 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")
Mas se eu transformar apenas , logon , parece que os limites de confiança em se tornam muito menores:
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
Claramente algo suspeito está acontecendo. Esses intervalos de confiança são confiáveis? EDITAR não é simplesmente um problema do grau de suavização, como foi sugerido em uma resposta. Sem a transformação de log, o parâmetro de suavização é
> model$sp
s(Amplification)
5.03049e-07
Com a transformação de log, o parâmetro de suavização é realmente muito maior:
>log_model$sp
s(log(Amplification))
0.0005156608
Mas essa não é a razão pela qual os intervalos de confiança se tornam tão pequenos. Por uma questão de fato, usando um parâmetro de suavização ainda maior sp = 0.001
, mas evitando qualquer transformação de log, as oscilações são reduzidas (como no caso de transformação de log), mas os erros padrão ainda são enormes em relação ao caso de transformação de log:
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
Em geral, se eu registrar a transformação e / ou , o que acontece com os intervalos de confiança? Se não for possível responder quantitativamente no caso geral, aceitarei uma resposta quantitativa (isto é, mostra uma fórmula) para o primeiro caso (o modelo exponencial) e forneça pelo menos um argumento de ondulação manual para o segundo caso (Modelo GAM).
mgcv
pode ser representada como uma soma dos termos do tipo - eu posso experimentá-los. Qual é o teste de Voung? Você pode fornecer mais detalhes? Você sabe se ele foi implementado em um pacote R?Respostas:
Você está vendo o toque, que é o resultado de passar uma alteração de alta frequência, ou seja, uma função de etapa, através de um filtro de baixa passagem, ou seja, o GAM.
Ao aplicar a transformação de log, você altera o gradiente da seção quase vertical do gráfico, no lado esquerdo, para que fique um pouco menos íngreme, com menos altas frequências implícitas e o efeito de toque desaparece.
Edite: algumas fotos do toque aqui: /electronics/79717/what-can-reduce-overshoot-and-ringing-on-a-simple-square-wave-pulse-generator
Edit2: observe que o aumento da suavização aumentaria o toque, uma vez que a suavização é essencialmente o filtro passa-baixo que está causando o toque. O que reduziria o toque seria, por exemplo: 1. remover os pontos na borda do penhasco à esquerda e recolocar, ou 2. reduzir a suavização ou 3. reduzir a frequência / aumentar o comprimento de onda / aumentar a frequência de corte da suavização .
Você pode ver que, se você remover o bit da borda do penhasco, o restante do gráfico será mais ou menos uma linha reta, então por que o GAM está ajustando uma onda sinusoidal nesses pontos? É inteiramente porque a parte da borda do penhasco está forçando um gradiente muito alto, o que causa superação subsequente.
Edit3: se fosse eu, acho que tentaria encontrar uma transformação que transformará o gráfico em uma linha aproximadamente reta. Não sei ao certo qual seria essa transformação, mas parece que o gráfico está muito perto de ser uma linha plana, assintótica a ~ 380 ou mais. Essa é uma não linearidade mais forte do que
log
, por exemplo , que se tornará simples, mas não tão rapidamente, eu acho. Talvez algo como um sigmóide inverso? Sigmoid é:... e parece (da wikipedia https://en.wikipedia.org/wiki/Sigmoid_function )
Sigmoide inverso é a
logit
função, https://en.wikipedia.org/wiki/Logit :Talvez uma transformação relacionada a isso, ou uma versão parametrizada, possa tornar o gráfico mais próximo de ser uma linha reta e, portanto, mais passível de técnicas estatísticas padrão?
fonte
gam
lo escolher por validação cruzada. Interessante: vou testar isso. Aprecio o insight (+1), mas ele não responde à pergunta original sobre o efeito das transformações de log nos intervalos de confiança.logit
transformar o gráfico em algo mais perto de uma linha reta