估计标准偏差与自变量缩放的比率

机器算法验证 正态分布 估计 实验设计 模型 异方差
2022-03-02 03:14:48

我有一个实验,我正在测量一个正态分布的变量Y,

YN(μ,σ)

然而,先前的实验已经提供了一些证据表明标准差σ是自变量的仿射函数X, IE

σ=a|X|+b

YN(μ,a|X|+b)

我想估计参数ab通过抽样Y在多个值X. 此外,由于实验限制,我只能采集有限(大约 30-40)个样本Y,并且更愿意在几个值上采样X由于不相关的实验原因。鉴于这些限制,有哪些方法可用于估计ab?

实验说明

如果您对我问上述问题的原因感兴趣,这是额外的信息。我的实验测量听觉和视觉空间感知。我有一个实验装置,我可以在其中呈现来自不同位置的听觉或视觉目标,X, 主体指示目标的感知位置,Y. 随着偏心率的增加(即增加|X|),我将其建模为σ多于。最后,我想估计ab视觉和听觉,所以我知道空间中各种位置的每种感觉的精确度。这些估计将用于预测同时呈现时视觉和听觉目标的相对权重(类似于此处介绍的多感官整合理论:http ://www.ncbi.nlm.nih.gov/pubmed/12868643 )。

*我知道在将中心凹与中心凹外空间进行比较时,这个模型对于视觉来说是不准确的,但我的测量仅限于中心凹外空间,这是一个不错的近似值。

2个回答

在像您这样的情况下,您有一个相对简单但“非标准”的生成模型来估计参数,我的第一个想法是使用像Stan这样的贝叶斯推理程序。您给出的描述将非常干净地转换为 Stan 模型。

一些示例 R 代码,使用 RStan(Stan 的 R 接口)。

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)

你会得到看起来像这样的输出(尽管你的随机数可能与我的不同):

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

该模型收敛良好(Rhat=1),有效样本量(n_eff)在所有情况下都相当大,因此在技术层面上该模型表现良好。的最佳估计a,bμ(在平均栏中)也与所提供的非常接近。

你不能指望封闭的公式,但你仍然可以写下似然函数并在数值上最大化它。你的模型是

YN(μ,a|x|+b)
然后对数似然函数(除了不依赖于参数的项)变为
l(μ,a,b)=ln(a|xi|+b)12(yiμa|xi|+b)2
这很容易编程并提供给数值优化器。

在 R 中,我们可以做

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

然后模拟一些数据:

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

然后制作对数似然函数:

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

然后优化它:

> 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