繁体   English   中英

如何用单边数据拟合高斯分布?

[英]How to fit Gaussian distribution with one-sided data?

x <- c(-3,-2.5,-2,-1.5,-1,-0.5)
y <- c(2,2.5,2.6,2.9,3.2,3.3)

在此处输入图像描述

挑战在于整个数据都是从左斜率开始的,如何生成一个双边高斯分布?

关于这个问题的信息不完整。 因此可以实现几种方法:

这是解决它的一种方法:

f <- function(par, x, y )sum((y - par[3]*dnorm(x,par[1],par[2]))^2)
a <- optim(c(0,  1, 1), f, x = x, y = y)$par
plot(x, y, xlim = c(-3,3.5), ylim = c(2, 3.5))
curve(dnorm(x, a[1], a[2])*a[3], add = TRUE, col = 2)

在此处输入图像描述

没有办法用这些密度拟合高斯分布。 如果提供了正确的 y 值,这将是解决问题的一种方法:

# Define function to be optimized
f <- function(pars, x, y){
  mu <- pars[1]
  sigma <- pars[2]
  y_hat <- dnorm(x, mu, sigma)
  se <- (y - y_hat)^2
  sum(se)
}

# Define the data
x <- c(-3,-2.5,-2,-1.5,-1,-0.5)
y <- c(2,2.5,2.6,2.9,3.2,3.3)

# Find the best paramters
opt <- optim(c(-.5, .1), f, 'SANN', x = x, y = y)

plot(
  seq(-5, 5, length.out = 200),
  dnorm(seq(-5, 5, length.out = 200), opt$par[1], opt$par[2]), type = 'l', col = 'red'
)
points(c(-3,-2.5,-2,-1.5,-1,-0.5), c(2,2.5,2.6,2.9,3.2,3.3))

在此处输入图像描述

使用 nls 获得 y to.lin.a * dnorm(x, b, c) 的最小二乘拟合,其中.lin.a, b 和 c 是要估计的参数。

fm <- nls(y ~ cbind(a = dnorm(x, b, c)), 
  start = list(b = mean(x), c = sd(x)), algorithm = "plinear")
fm

给予:

Nonlinear regression model
  model: y ~ cbind(a = dnorm(x, b, c))
   data: parent.frame()
      b       c  .lin.a 
 0.2629  3.2513 27.7287 
 residual sum-of-squares: 0.02822

Number of iterations to convergence: 7 
Achieved convergence tolerance: 2.582e-07

dnorm model(黑色曲线)似乎适合这些点,尽管即使是只涉及两个参数(截距和斜率)而不是 3 的直线(蓝线)也不错。

plot(y ~ x)
lines(fitted(fm) ~ x)

fm.lin <- lm(y ~ x)
abline(fm.lin, col = "blue")

截屏

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM