2

最近、統計シミュレーションを調べていて、相関行列の仕様に一致するランダム データを生成した後、各列を特定の平均値と標準偏差を持つように変換したいと考えています。次のコードでそれを行うことができましたが、非常に面倒で、これを行うより効率的な方法があるかどうか疑問に思っていました.

    #Input Correlation Matrix
    sigma <- matrix(c(1.00, -0.03, 0.39, -0.05, -0.08,
                      -0.03, 1.00, 0.07, -0.23, -0.16,
                       0.39, 0.07, 1.00, -0.13, -0.29,
                      -0.05, -0.23, -0.13, 1.00, 0.34,
                      -0.08, -0.16 ,-0.29, 0.34, 1.00), nr=5, byrow=TRUE)
    rownames(sigma) <-c("Exercise", "Hardiness", "Fitness", "Stress", "Illness")
    colnames(sigma) <-c("Exercise", "Hardiness", "Fitness", "Stress", "Illness")

    #The Choleski Decomposition Random Data Generator
    N <- 373
    L = chol(sigma)
    nvars = dim(L)[1]

    # Random variables that follow the sigma correlation matrix
    r = t(L) %*% matrix(rnorm(nvars*N), nrow=nvars, ncol=N)
    r = t(r)

    sample = as.data.frame(r)

    #Transform to appropriate means and standard deviations
    sample$Exercise <- c(((sample$Exercise - mean(sample$Exercise))/sd(sample$Exercise))*66.5+40.9)
    sample$Hardiness <- c(((sample$Hardiness - mean(sample$Hardiness))/sd(sample$Hardiness))*3.8+0)
    sample$Fitness <- c(((sample$Fitness - mean(sample$Fitness))/sd(sample$Fitness))*18.4+67.1)
    sample$Stress <- c(((sample$Stress - mean(sample$Stress))/sd(sample$Stress))*6.7+4.8)
    sample$Illness <- c(((sample$Illness - mean(sample$Illness))/sd(sample$Illness))*624.8+716.7)
    sample <- as.data.frame(sample)

私が単純化したかったのは、「適切な手段と標準偏差に変換する」というラベルの付いたコードの最後の部分です。以下は、各列変数の平均と標準偏差です (順番に)。

    means <-c(40.9, 0, 67.1, 4.8, 716.7)
    sdevs <-c(66.5, 3.8, 18.4, 6.7, 624.8)

あなたの助けとあなたの知識を喜んで共有してくれてありがとう!ご意見をお待ちしております。

4

2 に答える 2

5

あなたは使用することができscaleますsweep

sample <- scale(as.matrix(sample),TRUE,TRUE)
sample <- sweep(sample,2,sdevs,"*")
sample <- sweep(sample,2,means,"+")
于 2013-06-16T11:57:26.523 に答える
1

を使用sapplyすると、次のように列をループできます。

means <-c(40.9, 0, 67.1, 4.8, 716.7)
sdevs <-c(66.5, 3.8, 18.4, 6.7, 624.8)
mm <- colMeans(sample)
sapply(seq_along(mm),function(i){
   c(sample[,i] -mm[i]/sd((sample[,i])))*sdevs[i]+means[i]
})
于 2013-06-16T11:58:21.080 に答える