Qual è il nome del metodo di stima della densità in cui tutte le coppie possibili vengono utilizzate per creare una distribuzione della miscela normale?


12

Ho appena pensato a un modo pulito (non necessariamente buono) per creare stime di densità monodimensionali e la mia domanda è:

Questo metodo di stima della densità ha un nome? In caso contrario, è un caso speciale di qualche altro metodo in letteratura?

Ecco il metodo: Abbiamo un vettore che presumiamo sia tratto da una distribuzione sconosciuta che vorremmo stimare. Un modo per farlo è quello di prendere tutte le possibili coppie di valori in X e per ogni coppia [ x i , x j ] i j adattare una distribuzione normale usando la massima verosimiglianza. La stima della densità risultante è quindi la distribuzione della miscela che consiste in tutte le Normali risultanti, in cui a ciascuna Normale viene assegnato lo stesso peso.X=[x1,x2,...,xn]X[xi,xj]ij

La figura seguente illustra l'utilizzo di questo metodo sul vettore . Qui i cerchi sono i punti di riferimento dei dati, le normali colorate sono le distribuzioni di massima verosimiglianza stimate usando ogni coppia possibile e la linea nera spessa mostra la stima della densità risultante (cioè la distribuzione della miscela).[1.3,0.15,0.73,1.4]

inserisci qui la descrizione dell'immagine

A proposito, è davvero facile implementare un metodo in R che preleva un campione dalla distribuzione della miscela risultante:

# Generating some "data"
x <- rnorm(30)

# Drawing from the density estimate using the method described above.
density_estimate_sample <- replicate(9999, {
  pair <- sample(x, size = 2)
  rnorm(1, mean(pair), sd(pair))
})

# Plotting the density estimate compared with 
# the "data" and the "true" density.
hist(x ,xlim=c(-5, 5), main='The "data"')
hist(density_estimate_sample, xlim=c(-5, 5), main='Estimated density')
hist(rnorm(9999), xlim=c(-5, 5), main='The "true" density')

inserisci qui la descrizione dell'immagine


5
Prova il tuo metodo usandox <- c(rnorm(30), rnorm(30, 10))
Dason

2
@Dason Sì, in tal caso il metodo non funziona affatto! :) Inoltre non converge con n grande.
Rasmus Bååth,

4
Sembra una versione corrotta della stima della densità del kernel in cui la larghezza di banda è stimata per convalida incrociata!
Xi'an,

X=[x1,x2,,xn]n

Risposte:


6

Questa è un'idea intrigante, perché lo stimatore della deviazione standard sembra essere meno sensibile agli outlier rispetto ai soliti approcci radice-media-quadrata. Tuttavia, dubito che questo stimatore sia stato pubblicato. Ci sono tre ragioni per cui: è computazionalmente inefficiente, è di parte, e anche quando il bias è corretto, è statisticamente inefficiente (ma solo un po '). Questi possono essere visti con una piccola analisi preliminare, quindi facciamo prima quello e poi traggiamo le conclusioni.

Analisi

μσ(xi,xj)

μ^(xi,xj)=xi+xj2

e

σ^(xi,xj)=|xixj|2.

Pertanto il metodo descritto nella domanda è

μ^(x1,x2,,xn)=2n(n1)i>jxi+xj2=1ni=1nxi,

che è il solito stimatore della media e

σ^(x1,x2,,xn)=2n(n1)i>j|xixj|2=1n(n1)i,j|xixj|.

E=E(|Xio-Xj|)ioj

E(σ^(X1,X2,...,Xn))=1n(n-1)Σio,jE(|Xio-Xj|)=E.

XioXj2σ22σχ(1)2/π

E=2πσ.

2/π1.128

σ^

conclusioni

  1. σ^n=20,000

    figura

  2. Σio,j|Xio-Xj|O(n2)O(n)n10,000R. (Su altre piattaforme i requisiti di RAM sarebbero molto più piccoli, forse con un leggero costo in termini di tempo di calcolo.)

  3. È statisticamente inefficiente. Per dargli il miglior risultato, consideriamo la versione imparziale e confrontiamola con la versione imparziale dei minimi quadrati o dello stimatore della massima verosimiglianza

    σ^OLS=(1n-1Σio=1n(Xio-μ^)2)(n-1)Γ((n-1)/2)2Γ(n/2).

    Rn=3n=300σ^OLSσ

poi

σ^


Codice

sigma <- function(x) sum(abs(outer(x, x, '-'))) / (2*choose(length(x), 2))
#
# sigma is biased.
#
y <- rnorm(1e3) # Don't exceed 2E4 or so!
mu.hat <- mean(y)
sigma.hat <- sigma(y)

hist(y, freq=FALSE,
     main="Biased (dotted red) and Unbiased (solid blue) Versions of the Estimator",
     xlab=paste("Sample size of", length(y)))
curve(dnorm(x, mu.hat, sigma.hat), col="Red", lwd=2, lty=3, add=TRUE)
curve(dnorm(x, mu.hat, sqrt(pi/4)*sigma.hat), col="Blue", lwd=2, add=TRUE)
#
# The variance of sigma is too large.
#
N <- 1e4
n <- 10
y <- matrix(rnorm(n*N), nrow=n)
sigma.hat <- apply(y, 2, sigma) * sqrt(pi/4)
sigma.ols <- apply(y, 2, sd) / (sqrt(2/(n-1)) * exp(lgamma(n/2)-lgamma((n-1)/2)))

message("Mean of unbiased estimator is ", format(mean(sigma.hat), digits=4))
message("Mean of unbiased OLS estimator is ", format(mean(sigma.ols), digits=4))
message("Variance of unbiased estimator is ", format(var(sigma.hat), digits=4))
message("Variance of unbiased OLS estimator is ", format(var(sigma.ols), digits=4))
message("Efficiency is ", format(var(sigma.ols) / var(sigma.hat), digits=4))

La letteratura pertinente risale ad un po 'ad es. Downton, F. 1966 Stime lineari con coefficienti polinomiali. Biometrika 53: 129-141 doi: 10.1093 / biomet / 53.1-2.129
Nick Cox,

Wow, ho ottenuto più di quanto mi aspettassi! :)
Rasmus Bååth,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.