Standart Sapmanın Bağımsız Değişkenle Ölçeklenme Oranını Tahmin Etme


11

Normalde dağıtılan değişkeninin ölçümlerini aldığım bir denem var ,Y

YN(μ,σ)

Bununla birlikte, önceki deneyler, standart sapmanın bağımsız bir değişken afin fonksiyonu olduğu , yaniXσX

σ=a|X|+b

YN(μ,a|X|+b)

ve parametrelerini çoklu değerlerinde örnekleyerek tahmin etmek istiyorum . Ek olarak, deney sınırlamaları nedeniyle, sadece sınırlı sayıda (yaklaşık 30-40) örneği alabilir ve ilgisiz deneysel nedenlerden dolayı çeşitli değerlerinde örneklemeyi tercih ederim . Bu kısıtlamalar göz önüne alındığında, ve tahmin etmek için hangi yöntemler mevcuttur ?b Y X Y X a babYXYXab

Deneme Açıklaması

Yukarıdaki soruyu neden sorduğumla ilgileniyorsanız, bu ekstra bilgi. Deneyim işitsel ve görsel mekansal algıyı ölçer. Farklı konumlardan X veya işitsel hedefleri sunabileceğim bir deney düzeneğim var Xve konular hedefin algılanan konumunu ( Y . Hem vizyon * hem de işitme , yukarıda \ sigma olarak modellediğim artan eksantriklikle (yani artan |X| ) daha az kesinleşir . Sonuçta, a ve b'yi tahmin etmek istiyorumσabhem görme hem de işitme için, bu yüzden uzayda çeşitli yerlerde her duygunun kesinliğini biliyorum. Bu tahminler, eşzamanlı olarak sunulduğunda görsel ve işitsel hedeflerin göreceli ağırlıklandırmasını tahmin etmek için kullanılacaktır (burada sunulan çok ölçekli entegrasyon teorisine benzer: http://www.ncbi.nlm.nih.gov/pubmed/12868643 ).

* Bu modelin foveal ile ekstrafoveal boşluk karşılaştırılırken görme açısından yanlış olduğunu biliyorum, ancak ölçümlerim sadece bunun iyi bir yaklaşım olduğu extrafoveal alanla kısıtlı.


2
İlginç bir sorun. Muhtemelen en iyi çözümler, bu denemeyi gerçekleştirme nedenlerinizi dikkate alacaktır. Nihai hedefleriniz neler? Tahmin? , ve / veya tahmini ? Bize amaç hakkında ne kadar çok şey anlatabilirseniz, cevaplar o kadar iyi olabilir. a σμaσ
whuber

SD negatif olmadığından , X'in doğrusal bir fonksiyonu olması pek olası değildir. Öneriniz olan bir | X |, X = 0'da minimum / daha dar veya daha geniş bir V şekli gerektirir, bu benim için oldukça doğal olmayan bir olasılık gibi görünüyor . Bunun doğru olduğundan emin misin?
gung - Monica'yı eski

İyi nokta @gung, sorunumu uygunsuz bir şekilde aşırı basitleştirirdim. in afin bir fonksiyonu olduğunu söylemek daha gerçekçi olurdu. . Sorumu düzenleyeceğim. | X |σ|X|
Adam Bosen

@whuber Bunun istenmesinin nedeni biraz dahil, ancak denemeyi nasıl açıklayacağımı ve yakında soruma biraz daha ayrıntı ekleyeceğim.
Adam Bosen

1
X = 0'ın minimum SD'yi temsil ettiğine ve f (| X |) monotonik olduğuna inanmak için iyi bir nedeniniz var mı?
gung - Monica'yı eski

Yanıtlar:


2

Parametrelerinizi tahmin etmek istediğiniz nispeten basit, ancak "standart dışı" üretken bir modelin olduğu bir durumda, ilk düşüncem Stan gibi bir Bayesci çıkarım programı kullanmak olacaktır . Verdiğiniz açıklama bir Stan modeline çok temiz bir şekilde tercüme edilecektir.

RStan kullanan bazı örnek R kodları (Stan'in R arayüzü).

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)

Buna benzer bir çıktı elde edersiniz (rastgele sayılarınız muhtemelen benimkinden farklı olacaktır):

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).

Model iyi yakınsadı (Rhat = 1) ve etkili örnek boyutu (n_eff) her durumda oldukça büyüktür, bu nedenle teknik düzeyde model iyi davranır. , ve (ortalama sütunda) için en iyi tahminler , sağlananlara oldukça yakındır.b μabμ


Oh, bunu beğendim! Stan'ı daha önce hiç duymamıştım, referans için teşekkürler. Başlangıçta analitik bir çözüm umuyordum, ancak cevapların eksikliği göz önüne alındığında, birinin var olduğundan şüpheliyim. Cevabınızın bu soruna en iyi yaklaşım olduğuna inanmaya meyilliyim.
Adam Bosen

Analitik bir çözüm mevcut olsaydı beni tamamen şok etmezdi, ama kesinlikle biraz şaşırırdım. Stan gibi bir şey kullanmanın gücü, modelinizde değişiklik yapmanın çok kolay olmasıdır - analitik bir çözüm muhtemelen modele verildiği gibi çok sıkı bir şekilde kısıtlanacaktır.
Martin O'Leary

2

Kapalı formüller bekleyemezsiniz, ancak yine de olabilirlik işlevini yazabilir ve sayısal olarak en üst düzeye çıkarabilirsiniz. Modeliniz Sonra loglikelihood işlevi (parametrelere bağlı olmayan bir terim dışında) ) olur ve programlaması kolaydır ve sayısal bir optimize ediciye verin.l ( μ , a , b ) =

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

R de yapabiliriz

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 )
    }
}

Ardından bazı verileri simüle edin:

> 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)

Ardından mantıksallık işlevini yapın:

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

Ardından optimize edin:

> 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
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.