Se estima que el error correctamente será complicado. Pero me gustaría sugerir que es más importante en primer lugar encontrar un mejor procedimiento para restar de fondo. Sólo una vez un buen procedimiento está disponible sería la pena analizar la cantidad de error.
En este caso, la media está sesgada al alza por las aportaciones de la señal, que se ven lo suficientemente grande como para ser importante. En lugar de utilizar un estimador más robusto. Una simple, es la mediana. Por otra parte, un poco más se puede extraer de estos datos mediante el ajuste de las columnas y de las filas al mismo tiempo. Esto se llama "mediana polaco." Es muy rápido para llevar a cabo y está disponible en algunos programas de software (como R
).
Estas figuras de los datos simulados con los 793 filas y 200 columnas muestran el resultado del ajuste de fondo con una mediana de polaco. (Ignorar las etiquetas en el eje de las y; son un artefacto de software usado para mostrar los datos.)
Una muy ligera tendencia es todavía evidente en los datos ajustados: la parte superior e inferior trimestres, en los que la señal no está presente en ninguna columna, son un poco más verde que la mitad de la mitad. Sin embargo, por el contrario, simplemente restando la fila de los medios a partir de los datos produce un evidente sesgo:
Diagramas de dispersión (no se muestra aquí, sino que se produce por el código) de fondo real contra estimado de fondo confirmar la superioridad de la mediana polaco.
Ahora, esto es algo desleal la comparación, debido a que para calcular el fondo se ha seleccionado previamente columnas se cree que no tiene señal. Pero hay problemas con esto:
Si hay señales de bajo nivel presentes en esas zonas (los que no han visto o se espera), el sesgo de los resultados.
Sólo un pequeño subconjunto de los datos se ha utilizado, la ampliación de la estimación de errores en segundo plano. (El uso de sólo una décima parte de las columnas disponibles aproximadamente triplica el error en la estimación de fondo en comparación con el uso de las nueve décimas partes de las columnas que parecen tener poca o ninguna señal).
Además, incluso cuando se tiene la certeza de que algunas de las columnas no contienen las señales, usted todavía puede solicitar la mediana de polaco a esas columnas. Esto te protegerá de manera inesperada a las violaciones de sus expectativas (que estos son señal de áreas libres). Por otra parte, esta robustez le permitirá ampliar el conjunto de las columnas utilizadas para la estimación de fondo, porque si, inadvertidamente, se incluyen algunas con algo de señal, que sólo tendrá un efecto insignificante.
Procesamiento adicional para identificar valores atípicos aislados y para estimar y extraer la señal de que se puede hacer, tal vez en el espíritu de mi respuesta a una reciente relacionada con la pregunta.
R
código de:
#
# Create background.
#
set.seed(17)
i <- 1:793
row.sd <- 0.08
row.mean <- log(60) - row.sd^2/2
background <- exp(rnorm(length(i), row.mean, row.sd))
k <- sample.int(length(background), 6)
background[k] <- background[k] * 1.7
par(mfrow=c(1,1))
plot(background, type="l", col="#000080")
#
# Create a signal.
#
j <- 1:200
f <- function(i, j, center, amp=1, hwidth=5, l=0, u=6000) {
0.2*amp*outer(dbeta((i-l)/(u-l), 3, 1.1), pmax(0, 1-((j-center)/hwidth)^4))
}
#curve(f(x, 10, center=10), 0, 6000)
#image(t(f(i,j, center=100,u=600)), col=c("White", rainbow(100)))
u <- 600
signal <- f(i,j, center=10, amp=110, u=u) +
f(i,j, center=90, amp=90, u=u) +
f(i,j, center=130, amp=80, u=u)
#
# Combine signal and background, both with some iid multiplicative error.
#
ccd <- outer(background, j, function(i,j) i) * exp(rnorm(length(signal), sd=0.05)) +
signal * exp(rnorm(length(signal), sd=0.1))
ccd <- matrix(pmin(120, ccd), nrow=length(i))
#image(j, i, t(ccd), col=c(rep("#f8f8f8",20), rainbow(100)),main="CCD")
#
# Compute background via row means (not recommended).
# (Returns $row and $overall to match the values of `medpolish`.)
#
mean.subtract <- function(x) {
row <- apply(x, 1, mean)
overall <- mean(row)
row <- row - overall
return(list(row=row, overall=overall))
}
#
# Estimate background and adjust the image.
#
fit <- medpolish(ccd)
#fit <- mean.subtract(ccd)
ccd.adj <- ccd - outer(fit$row, j, function(i,j) i)
image(j, i, t(ccd.adj), col=c(rep("#f8f8f8",20), rainbow(100)),
main="Background Subtracted")
plot(fit$row + fit$overall, type="l", xlab="i")
plot(background, fit$row)
#
# Plot the results.
#
require(raster)
show <- function(y, nrows, ncols, hillshade=TRUE, aspect=1, ...) {
x <- apply(y, 2, rev)
x <- raster(x, xmn=0, xmx=ncols, ymn=0, ymx=nrows*aspect)
crs(x) <- "+proj=lcc +ellps=WGS84"
if (hillshade) {
slope <- terrain(x, opt='slope')
aspect <- terrain(x, opt='aspect')
hill <- hillShade(slope, aspect, 10, 60)
plot(hill, col=grey(0:100/100), legend=FALSE, ...)
alpha <- 0.5; add <- TRUE
} else {
alpha <- 1; add <- FALSE
}
plot(x, col=rainbow(127, alpha=alpha), add=add, ...)
}
par(mfrow=c(1,2))
asp <- length(j)/length(i) * 6/8
show(ccd, length(i), length(j), aspect=asp, main="Raw Data")
show(ccd.adj, length(i), length(j), aspect=asp, main="Adjusted Data")