模拟因变量非正态分布的回归数据

机器算法验证 r 回归 模拟 随机生成
2022-03-18 15:09:31

对于回归分析,了解数据生成过程以检查所用方法的工作原理通常很有用。虽然对于简单的线性回归执行此操作相当简单,但当因变量必须遵循特定分布时,情况并非如此。

考虑一个简单的线性回归:

N    <- 100
x    <- rnorm(N)
beta <- 3 + 0.4*rnorm(N)
y    <- 1 + x * beta + .75*rnorm(N)

有没有什么办法可以使用相同的方法,但y不是正常的,比如左偏?

1个回答

如果我正确理解您的问题,这很容易。你只需要决定你希望你的错误有什么分布,并使用相应的随机生成函数。

有许多倾斜的分布,所以你需要弄清楚你喜欢哪一个。此外,大多数偏态分布(例如,对数正态分布、卡方、Gamma、Weibull 等)都是右偏态的,因此需要进行一些小的调整(例如,乘以)。 1

这是修改代码的示例:

set.seed(5840)  # this makes the example exactly reproducible
N      <- 100
x      <- rnorm(N)
beta   <- 0.4
errors <- rlnorm(N, meanlog=0, sdlog=1)
errors <- -1*errors   # this makes them left skewed
errors <- errors - 1  # this centers the error distribution on 0
y      <- 1 + x*beta + errors

在此处输入图像描述

在这一点上,我应该注意,回归不对的分布做出任何假设,只对误差做出任何假设(参见此处:如果残差是正态分布的,但 y 不是正态分布怎么办?)。因此,这就是我上面回答的重点。 XYε


更新: 这是一个右偏版本,错误分布为 Weibull:

set.seed(5840)  # this makes the example exactly reproducible
N      <- 100
x      <- rnorm(N)
beta   <- 0.4
errors <- rweibull(N, shape=1.5, scale=1)
# errors <- -1*errors   # this makes them left skewed
errors <- errors - factorial(1/1.5)  # this centers the error distribution on 0
y      <- 1 + x*beta + errors

Weibull 数据已经正确倾斜,所以我们不需要改变它们的方向(即,我们丢弃-1*errors部分)。此外,从 Weibull 分布的维基百科页面,我们看到 Weibull 的平均值应该是:. 我们希望从每个错误中减去该值,以便生成的错误分布以为中心。这允许代码的结构部分(即)准确反映数据生成过程的结构部分。 E[W]=(1/shape)!01 + x*beta

在此处输入图像描述

ExGaussian分布是正态分布和指数分布的总和。gamlss.dist包中有一个函数?rexGAUS来生成这些。我没有那个包,但你应该能够毫不费力地调整我上面的代码。您还可以生成一个随机正态变量 (via ) 和一个指数 (via ) 并将它们相加很容易。请记住,在将错误添加到数据生成过程的结构部分之前,从每个错误(注意不要减去样本均值,不过!) rnorm()rexp()μ+1/λmean(errors)


一些最终的,不相关的评论: 您在问题中的示例代码有些混乱(意思是没有冒犯)。因为使用默认情况下rnorm(N)生成数据,将生成. 如果您使用后一种表述,您的代码(可能还有您的想法)会更加清晰。此外,您的代码似乎很困惑。我们通常认为mean=0sd=10.4*rnorm(N)rnorm(N, mean=0, sd=0.4)betaβ在回归型模型中作为参数,而不是随机变量。也就是说,控制数据生成过程的行为的未知常数,但过程的随机性被错误封装。当我们使用多级模型时,这不是我们考虑的方式,您的代码似乎介于标准回归模型和多级回归模型的代码之间。单独指定 beta 是保持代码概念清晰性的好主意,但对于标准回归模型,您只需为每个 beta 分配一个数字(例如,beta0 <- 1; beta1 <- .04)。