【问题标题】:How to generate sample data with exact moments如何生成具有精确时刻的样本数据
【发布时间】:2013-04-20 16:20:39
【问题描述】:

如何生成准确的数据?

在 R 中,我们可以选择使用 rnorm 从具有某些特征(例如,mean=0,sd=1)的总体中进行抽样,但是我们如何获得具有准确均值的数据=0, sd=1?

这是一个简单的例子。我也对应用获取精确数据的方法的更通用方法感兴趣(例如,精确相关性为 0.2 的多变量数据)

【问题讨论】:

  • 您希望样本均值完全等于总体均值吗?我怀疑它是否可能。
  • 您是在问如何在 R 或 python 中执行此操作吗?或者两者兼而有之?您始终可以使用线性变换强制生成的数据具有感兴趣的均值和标准差。
  • 您是否只是对高斯案例感兴趣,或者您想为任何一般分布这样做?
  • @Dason 任何发行版,任何一种语言。

标签: python r


【解决方案1】:

简单地扩展您的结果。在单变量情况下:

set.seed(21)
x <- rnorm(1000)
mean(x)
sd(x)
y <- x-mean(x)
y <- y/sd(x)
mean(y)  # within floating point precision of 0
sd(y)

多变量情况有点复杂,但可能。

【讨论】:

  • 也许显示乘法和加法,然后得到一个精确的任意结果。
  • @flodel:pssh,太容易了! ;-)
【解决方案2】:

听起来你想要 MASS 包中的 mvrnorm。

sigma <- matrix(c(1.0, 0.0, -0.5,
                  0.0, 1.0,  0.5,
                 -0.5, 0.5,  1.0), 3, byrow = TRUE)
mat <- mvrnorm(10, c(0,0,0), sigma, empirical = TRUE)
cor(mat)
#     [,1]  [,2]  [,3]
#[1,]  1.0   0.0  -0.5
#[2,]  0.0   1.0   0.5
#[3,] -0.5   0.5   1.0

请注意,通过为每个组选择 1 的 SD,我简化了事情,因为协方差将等于相关性,但您可以通过记住相关性是协方差除以 SD 的乘积来概括这一点。

(请注意,当您运行代码时,您可能不会得到精确的值,而是机器精度范围内的值......这是我们所希望的)

【讨论】:

    【解决方案3】:

    您可以简单地重新调整数据。

    n <- 100
    x <- rnorm(n)
    x <- ( x - mean(x) ) / sd(x)
    mean(x)   # 0, up to machine precision
    sd(x)     # 1
    

    您也可以使用ppoints 来获得等距点 (不过,您仍然需要重新调整)。

    x <- qnorm( ppoints(n) )
    x <- ( x - mean(x) ) / sd(x)
    mean(x)
    sd(x)
    

    在更高维度,转换有点棘手。 如果x 是一个高斯向量,均值为0,方差为单位矩阵, 那么C %*% x 是高斯分布,均值为零,方差矩阵V = CC'CV 的 Cholesky 变换; 它可以看作是平方根的类似物 (对称,半正定)矩阵。

    实际上需要其中两个转换: 第一个将方差设置为恒等式,第二个将其设置为所需值。

    # Desired variance matrix
    V <- matrix( c(1,.2,.2, .2,1,.2, .2,.2,1), 3, 3 )
    
    # Random data
    n <- 100
    k <- 3
    x <- matrix( rnorm(k*n), nc=3 )
    
    # Set the mean to 0, and the variance to the identity
    x <- t( t(x) - colMeans(x) )
    colMeans(x)   # 0
    C1 <- chol(var(x))
    x <- x %*% solve(C1)
    var(x)   # identity matrix
    
    # Set the variance to the desired value
    C2 <- chol(V)
    x <- x %*% C2
    var(x) - V   # zero
    

    【讨论】:

      猜你喜欢
      • 2019-01-02
      • 1970-01-01
      • 2015-12-26
      • 1970-01-01
      • 2013-11-17
      • 2020-07-30
      • 1970-01-01
      • 1970-01-01
      • 2015-12-16
      相关资源
      最近更新 更多