作为预测函数的平滑矩

机器算法验证 交叉验证 时刻 样条 正则化 无游戏
2022-03-22 04:16:31

设置

描述一个连续的预测变量(例如年龄)。是一个随机变量(例如高度),它是的某个函数。xYx

数据由个点组成,每个点都是的组合(例如)。nxydatai=(agei,heighti)

的分布可能是非正态的,具有一定程度的偏斜。不仅的平均值,而且它的方差和偏度也可能是的函数(例如,成年人平均比儿童高,但身高也更加多样化,并且异常高的异常值也更多)。YYx

使用 GAMLSS 的相关方法

我知道,如果假设一个分布则 GAMLSS可用于描述分布的参数,其中每个参数都建模为的函数。这些函数可以作为多项式或样条给出,可能使用一些惩罚来平滑。Yx

YD(μ,σ)g1(μ)=s1(x)g2(σ)=s2(x)

我的问题

然而,这些代表所选分布的参数的函数。是否也可以在不指定特定分布的情况下获得数据的矩函数(例如均值、方差、偏度)

mean(Y)=s3(x)var(Y)=s4(x)skew(Y)=s5(x)

我猜一个移动平均线,同样,一个移动方差移动偏度,将给出一个类似的函数但我想利用GAMLSS的优化(例如 ML、GAIC 或 GCV),包括对过度拟合的一些惩罚。如果这存在。如果在不首先指定分布的情况下甚至有意义。x

例子

作为一个最小的工作示例,我们将生成我们知道时刻的数据。

demo.BSplines首先,我们从库中改编gamlss.demos以创建一个生成随机样条的函数。

library(gamlss)
library(gamlss.demo)
print(demo.BSplines)

tpower <- function(x, t, p) (x - t)^p * (x > t)

bbase <- function(x, xl=min(x), xr=max(x), nseg=10, deg=3) {
  dx <- (xr - xl)/nseg
  knots <- seq(xl - deg * dx, xr + deg * dx, by = dx)
  P <- outer(x, knots, tpower, deg)
  n <- dim(P)[2]
  D <- diff(diag(n), diff = deg + 1)/(gamma(deg + 1) * dx^deg)
  B <- (-1)^(deg + 1) * P %*% t(D)
  return(B)
}

bs.random <- function(nseg=5, bdeg=3, xlim=100) {
  x <- seq(0, xlim)
  B <- bbase(x, nseg = nseg, deg = bdeg)
  a <- runif(ncol(B))
  z <- B %*% a
  return(z)
}

让我们生成两个 B 样条。

set.seed(9876)
nseg <- 5
bdeg <- 3
xlim <- 100
datan <- 20000

mu <- bs.random(nseg=nseg, bdeg=bdeg, xlim=xlim)
sigma <- bs.random(nseg=nseg, bdeg=bdeg, xlim=xlim)
plot(NULL, xlim=c(0,100), ylim=c(0,1), xlab="x", ylab="y", main="Random B-splines")
lines(mu, col="blue")
lines(sigma, col="pink")

在此处输入图像描述

这些用作LogNormal分布的输入参数。我们现在按照这种偏斜分布对各种yx

xs <- ceiling(runif(datan, 0, xlim))
ys <- sapply(xs, function(x){rlnorm(1, meanlog = mu[x], sdlog = sigma[x])})

由于我们知道作为两个参数函数的LogNormal分布的均值、方差和偏度的表达式,我们可以直接确定这些。

seq <- seq(0, xlim)
mean <- sapply(seq, function(x){exp(mu[x]+sigma[x]^2/2)})
variance <- sapply(seq, function(x){(exp(sigma[x]^2)-1)*exp(2*mu[x]+sigma[x]^2)})
skewness <- sapply(seq, function(x){(exp(sigma[x]^2)+2)*sqrt(exp(sigma[x]^2)-1)})

plot(xs, ys, ylim = c(0, 4), xlab="x", ylab="y", main="Random Data with Moments")
lines(seq, mean, col="red")
lines(seq, variance, col="orange")
lines(seq, skewness, col="green")

在此处输入图像描述

服从LogNormal分布的情况下,找到一个检索这三个矩的过程。Y

1个回答

继续在 OP 中生成的示例数据,我们可以使用惩罚 B 样条为数据的均值构建一个简单的GAMLSS模型。该模型假设为正态分布我们只对平均值的样条感兴趣。

m1 <- gamlss(ys~pb(xs))
plot(NULL, xlim=c(0,xlim), ylim = c(0, 4), xlab="x", ylab="y", main="Real and Estimated Mean")
lines(seq, mean, col="red")
lines(xs[order(xs)], fitted(m1)[order(xs)], col="red", lty = 2)

估计的平均值类似于作为函数的真实平均值。x

在此处输入图像描述

我们现在从数据中减去这个估计的平均值并对数据进行平方。我们再次运行相同的模型来估计方差。

ys2 <- (ys - fitted(m1))^2
m2 <- gamlss(ys2~pb(xs))
plot(NULL, xlim=c(0,xlim), ylim = c(0, 4), xlab="x", ylab="y", main="Real and Estimated Variance")
lines(seq, variance, col="orange")
lines(xs[order(xs)], fitted(m2)[order(xs)], col="orange", lty = 2)

估计的方差类似于作为函数的实际方差。x

在此处输入图像描述

我们现在除以估计方差的平方根并将数据立方计算。我们再次运行相同的模型来估计偏度。

ys3 <- ((ys - fitted(m1))/sqrt(fitted(m2)))^3
m3 <- gamlss(ys3~pb(xs))
plot(NULL, xlim=c(0,xlim), ylim = c(0, 4), xlab="x", ylab="y", main="Real and Estimated Skewness")
lines(seq, skewness, col="green")
lines(xs[order(xs)], fitted(m3)[order(xs)], col="green", lty = 2)

在此处输入图像描述

估计的偏度类似于作为函数的实际偏度。x

欢迎进一步评论,因为我不确定此程序是否:

  • 可靠地提供矩估计
  • 是最准确/最有效的方法
  • 根据 OP 的要求,受到适当的处罚
  • 真的需要 GAMLSS 或者可以用更简单的方式完成