Stimare la velocità con cui la deviazione standard viene ridimensionata con una variabile indipendente


11

Ho un esperimento in cui sto prendendo le misure di una variabile normalmente distribuita ,Y

YN(μ,σ)

Tuttavia, esperimenti precedenti hanno fornito alcune prove del fatto che la deviazione standard è una funzione affine di una variabile indipendente , vale a direXσX

σ=a|X|+b

YN(μ,a|X|+b)

Vorrei stimare i parametri e campionando a più valori di X . Inoltre, a causa delle limitazioni dell'esperimento, posso solo prendere un numero limitato (circa 30-40) di campioni di Y e preferirei campionare a diversi valori di X per ragioni sperimentali non correlate. Dati questi vincoli, quali metodi sono disponibili per stimare un e B ?b Y X Y X a babYXYXab

Descrizione dell'esperimento

Queste sono informazioni aggiuntive, se sei interessato al perché sto ponendo la domanda sopra. Il mio esperimento misura la percezione spaziale uditiva e visiva. Ho un setup esperimento in cui posso presentare sia uditivo o bersagli visibili da diverse posizioni, X , e soggetti indicano la posizione percepita del bersaglio, Y . Sia la visione * che l'audizione diventano meno precisi con l'aumentare dell'eccentricità (cioè aumentando |X| ), che io modello come σ sopra. In definitiva, mi piacerebbe stimare a e bsia per la visione che per l'audizione, quindi conosco la precisione di ogni senso attraverso una serie di posizioni nello spazio. Queste stime verranno utilizzate per prevedere la ponderazione relativa degli obiettivi visivi e uditivi quando presentati contemporaneamente (simile alla teoria dell'integrazione multisensoriale qui presentata: http://www.ncbi.nlm.nih.gov/pubmed/12868643 ).

* So che questo modello non è accurato per la visione quando si confronta lo spazio foveale con quello extrafoveale, ma le mie misurazioni sono limitate esclusivamente allo spazio extrafoveale, dove questa è un'approssimazione decente.


2
Problema interessante. È probabile che le migliori soluzioni terranno conto dei motivi per cui stai facendo questo esperimento. Quali sono i tuoi obiettivi finali? Predizione? Stima di , , e / o ? Più puoi dirci dello scopo, migliori sono le risposte. a σμaσ
whuber

Poiché la SD non può essere negativa, è improbabile che sia una funzione lineare di X. Il tuo suggerimento, a | X |, richiede una forma a V più stretta o più ampia con un minimo a X = 0, che a me sembra una possibilità piuttosto innaturale . Sei sicuro che sia giusto?
gung - Ripristina Monica

Buon punto @gung, ho semplificato in modo improprio il mio problema. Sarebbe più realistico affermare che è una funzione affine di. Modificherò la mia domanda. | X |σ|X|
Adam Bosen,

@whuber Il motivo per volerlo è un po 'coinvolto, ma penserò a come spiegare l'esperimento e aggiungere presto altri dettagli alla mia domanda.
Adam Bosen,

1
Hai una buona ragione, a priori, per credere che X = 0 rappresenti la SD minima, e che f (| X |) sia monotonico?
gung - Ripristina Monica

Risposte:


2

In un caso come il tuo, in cui hai un modello generativo relativamente semplice, ma "non standard" per il quale vorresti stimare i parametri, il mio primo pensiero sarebbe quello di utilizzare un programma di inferenza bayesiana come Stan . La descrizione che hai dato si tradurrebbe in modo molto chiaro in un modello Stan.

Alcuni esempi di codice R, usando RStan (l'interfaccia R con Stan).

library(rstan)

model_code <- "
data {
    int<lower=0> n; // number of observations
    real y[n];
    real x[n];
}
parameters {
    real mu; // I've assumed mu is to be fit.
             // Move this to the data section if you know the value of mu.
    real<lower=0> a;
    real<lower=0> b;
}
transformed parameters {
    real sigma[n];
    for (i in 1:n) {
        sigma[i] <- a + b * fabs(x[i]);
    }
}
model {
    y ~ normal(mu, sigma);
}
"

# Let's generate some test data with known parameters

mu <- 0
a <- 2
b <- 1

n <- 30
x <- runif(n, -3, 3)
sigma <- a + b * abs(x)
y <- rnorm(n, mu, sigma)

# And now let's fit our model to those "observations"

fit <- stan(model_code=model_code,
            data=list(n=n, x=x, y=y))

print(fit, pars=c("a", "b", "mu"), digits=1)

Otterrai un output simile a questo (anche se i tuoi numeri casuali saranno probabilmente diversi dai miei):

Inference for Stan model: model_code.
4 chains, each with iter=2000; warmup=1000; thin=1; 
post-warmup draws per chain=1000, total post-warmup draws=4000.

   mean se_mean  sd 2.5%  25% 50% 75% 97.5% n_eff Rhat
a   2.3       0 0.7  1.2  1.8 2.2 2.8   3.9  1091    1
b   0.9       0 0.5  0.1  0.6 0.9 1.2   1.9  1194    1
mu  0.1       0 0.6 -1.1 -0.3 0.1 0.5   1.4  1262    1

Samples were drawn using NUTS(diag_e) at Thu Jan 22 14:26:16 2015.
For each parameter, n_eff is a crude measure of effective sample size,
and Rhat is the potential scale reduction factor on split chains (at 
convergence, Rhat=1).

Il modello ha ottenuto una buona convergenza (Rhat = 1) e la dimensione effettiva del campione (n_eff) è ragionevolmente grande in tutti i casi, quindi a livello tecnico il modello è ben educato. Le migliori stime di , e (nella colonna media) sono anche abbastanza vicine a quelle fornite.b μabμ


Oh, questo mi piace! Non avevo mai sentito parlare di Stan prima, grazie per il riferimento. Inizialmente speravo in una soluzione analitica, ma data la mancanza di risposte dubito che ne esista una. Sono propenso a credere che la tua risposta sia l'approccio migliore a questo problema.
Adam Bosen,

Non mi scioccerebbe completamente se esistesse una soluzione analitica, ma sarei sicuramente un po 'sorpreso. Il punto di forza dell'uso di qualcosa come Stan è che è molto semplice apportare modifiche al modello: una soluzione analitica sarebbe probabilmente fortemente vincolata al modello dato.
Martin O'Leary,

2

Non puoi aspettarti formule chiuse, ma puoi comunque scrivere la funzione di verosimiglianza e ingrandirla numericamente. Il tuo modello è Quindi la funzione loglikelihood (a parte un termine che non dipende dai parametri) diventa e che è facile da programmare e dare a un ottimizzatore numerico.

YN(μ,a|x|+b)
l(μ,a,b)=ln(a|xi|+b)12(yiμa|xi|+b)2

In R, possiamo fare

make_lik  <-  function(x,y){
    x  <-  abs(x)
    function(par) {
        mu <- par[1];a  <-  par[2];  b <-  par[3]
        axpb <-  a*x+b
        -sum(log(axpb)) -0.5*sum( ((y-mu)/axpb)^2 )
    }
}

Quindi simula alcuni dati:

> x <-  rep(c(2,4,6,8),10)
> x
 [1] 2 4 6 8 2 4 6 8 2 4 6 8 2 4 6 8 2 4 6 8 2 4 6 8 2 4 6 8 2 4 6 8 2 4 6 8 2 4
[39] 6 8
> a <- 1
> b<-  3
> sigma <-  a*x+b
> mu  <-  10
> y  <-  rnorm(40,mu, sd=sigma)

Quindi rendere la funzione loglikelihood:

> lik <-  make_lik(x,y)
> lik(c(10,1,3))
[1] -99.53438

Quindi ottimizzalo:

> optim(c(9.5,1.2,3.1),fn=function(par)-lik(par))
$par
[1] 9.275943 1.043019 2.392660

$value
[1] 99.12962

$counts
function gradient 
     136       NA 

$convergence
[1] 0

$message
NULL
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.