R 将数据转换为两个独立的组

R 将数据转换为两个独立的组,r,statistics,R,Statistics,我模拟了来自R中多元正态分布的两组数据,如下所示: #Package to generate a multivariate normal distribution library(mvtnorm) #The number of simulated variables that can be changed p=5 set.seed(30) #Generating the eigenvalues from a uniform distribution. m=p eigval <- run

我模拟了来自R中多元正态分布的两组数据,如下所示:

#Package to generate a multivariate normal distribution
library(mvtnorm)

#The number of simulated variables that can be changed
p=5

set.seed(30)
#Generating the eigenvalues from a uniform distribution.
m=p
eigval <- runif(m,0.25,1)

#Generating a positive symmetric matrix (this will be used as the covariance matrix for generation of the data.
#Ravi Varadhan(2008)
shat <- matrix(ncol=m, rnorm(m^2))
decomp <- qr(shat)
Q <- qr.Q(decomp)
R <- qr.R(decomp)
d <- diag(R)
ph <- d/abs(d)
O <- Q%*%diag(ph)
shat <- t(O)%*%diag(eigval)%*%(O)

#Variance-covariance matrix for the data generation.
sig <- shat

#Mean vectors for two groups where the parameters may be changed accordingly.
m1 <- runif(p,0.1,0.2)
m2 <- runif(p,0.4,0.9)

#Euclidean distance between two groups
dist(rbind(m1,m2), method = "euclidean")

#The number of observations from group1
n1 <- 30
#The number of observation from group2
n2 <- 70
#The total number of observations
n <- n1+n2

#Group Identifier where '1' represent group 1 and '2' represent group 2
G1 <- rep(1,n1)
G2 <- rep(2,n2)
G <- c(G1,G2)

#Generate Data from group 
library(mvtnorm)
g1 <- rmvnorm(n=n1, mean=m1, sigma=sig)
g2 <- rmvnorm(n=n2, mean=m2, sigma=sig)
g <-rbind(g1,g2)

Data   <- data.frame(G, DV1=g[ , 1], DV2=g[ , 2], DV3=g[ ,3], DV4=g[,4], DV5=g[ ,5])
生成多元正态分布的包 图书馆(mvtnorm) #可以更改的模拟变量数 p=5 种子集(30) #从均匀分布生成特征值。 m=p
eigval不确定您是否需要代码或关于
iris3
的问题的答案。我来谈一下后者

事实上,它是一个整洁的
阵列
,具有3个维度,既方便又便于演示。它之所以有效,是因为埃德加·安德森准确地采集了每个物种的50个样本。即时文件中没有任何内容表明第一个刚毛和第一个维吉尼亚之间存在相关配对,因此数据未配对。不幸的是,通过将物种排列成立方体中的平面,这表明了这种成对关系

考虑一下:如果埃德加取而代之的是51只刚毛而不是50只,但将另外两个物种保持在50只,那么阵列会是什么样子?其中一架飞机会比另外两架稍微高一点,而不是矩阵飞机。如果他以不同的顺序(因为没有说明顺序是重要的)取样50只刚毛呢。数组将不同,查看第三个边距(
iris3[1,1,]
)的分析将返回不同的结果,但实际数据实际上没有改变

因此,我相信它是在一个完美排列的三维矩阵中,是为了处理多维数据,而不是因为数据实际上属于那个方向

编辑

如果您想知道如何将(任何)数据从二维数组转换为三维数组,下面是一个使用
iris
的示例。这有两个假设:

  • 所有数据都属于相同的
    。例如,在下面的示例中,我删除了
    $Species
    列;因为
    数组
    要求内部所有内容都是同一个类,如果我没有删除它,那么所有数字都将转换为字符,可能不是您想要的

  • 正如我上面所讨论的,添加维度中的配对实际上是相关的。如果数据没有配对,这个过程就可以正常工作,那么认为对于其他数据,不同类别的数据可能有不同的计数是完全合乎逻辑的

  • 与#2类似(并且与之相关),所有类别都应该有相同数量的数据。如果您愿意接受将
    NA
    行扩展到较短的类别中,则可以忽略这一点,但这对我来说似乎有点草率

  • 基尔 首先,我们将当前二维数据分成若干组,方便(但必须)地生成具有相同尺寸(50 x 4)的元素。
    -5
    删除了第五列,
    $Species
    ,这样我们使用
    as.matrix
    的下一步将不会将
    数值
    转换为
    字符

    irislist <- by(iris, iris$Species, `[`, -5)
    
    3D矩阵制作完成了!向其中添加维度名称可能很好,但不是严格要求的:

    dimnames(mtx) <- list(NULL, colnames(irislist[[1]]), names(irislist))
    mtx
    # , , setosa
    #       Sepal.Length Sepal.Width Petal.Length Petal.Width
    #  [1,]          5.1         3.5          1.4         0.2
    #  [2,]          4.9         3.0          1.4         0.2
    #  [3,]          4.7         3.2          1.3         0.2
    #  [4,]          4.6         3.1          1.5         0.2
    #  [5,]          5.0         3.6          1.4         0.2
    # ...snip...
    
    收尾 这将如何处理您的数据还不清楚。当我运行您的代码时,我得到了六列,其中只有一列(
    Data$G
    )似乎是可以拆分为另一个维度的内容(即,它看起来可以是分类的)。不幸的是:

    table(Data$G)
    #  1  2 
    # 30 70 
    

    根据我的第三个要点,这不起作用。

    我认为数据在第三个轴上无法直接比较。例如,
    iris3[1,1,]
    为我们提供了每个物种一朵花的萼片长度。我不相信这些样本是以任何重要的方式“配对”的,因此它们在这个轴(边距3)上对齐的事实仅用于说明目的。(这就是它们被拆分的“原因”。我不确定您是否只想知道如何拆分
    iris
    数据集,而您的问题/示例代码的其余部分是不必要的,或者您是否想知道如何将数据重设为另一个维度,而
    iris3
    是一个骗局。请澄清!)@r2evans-我想知道iris3是如何在一个整洁的数组中聚合的,因为QDA分析的文档使用了iris3数据,而不是iris数据,如以下链接所示:
    dimnames(mtx) <- list(NULL, colnames(irislist[[1]]), names(irislist))
    mtx
    # , , setosa
    #       Sepal.Length Sepal.Width Petal.Length Petal.Width
    #  [1,]          5.1         3.5          1.4         0.2
    #  [2,]          4.9         3.0          1.4         0.2
    #  [3,]          4.7         3.2          1.3         0.2
    #  [4,]          4.6         3.1          1.5         0.2
    #  [5,]          5.0         3.6          1.4         0.2
    # ...snip...
    
    library(abind)
    mtx2 <- do.call("abind", c(irislist, list(along = 3)))
    str(mtx)
    #  num [1:50, 1:4, 1:3] 5.1 4.9 4.7 4.6 5 5.4 4.6 5 4.4 4.9 ...
    #  - attr(*, "dimnames")=List of 3
    #   ..$ : NULL
    #   ..$ : chr [1:4] "Sepal.Length" "Sepal.Width" "Petal.Length" "Petal.Width"
    #   ..$ : chr [1:3] "setosa" "versicolor" "virginica"
    
    table(Data$G)
    #  1  2 
    # 30 70