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



我已经模拟了来自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])
  • 现在我想通过使用此模拟数据应用QDA函数以下编码在线找到:

https://stat.ethz.ch/r-manual/r-devel/library/mass/mass/html/qda.html

但是,在此示例中,据说内置的IRIS数据已分为一个数据,该数据以S-Plus表示为3维的3维阵列,为50 x 4 x 3。(请参阅-https://stat.ethz.ch/r-manual/r-devel/library/datasets/html/iris.html)

有人可以告诉我如何将任何数据分为n x m x p?

不确定您是否想要对代码的答案或有关iris3的问题。我会谈论后者片刻。

这是一个整洁的array,具有3个维度是便利的,并且可以进行演示。之所以起作用,是因为埃德加·安德森(Edgar Anderson)精确收集了每种物种的50个样本。直接文档中没有任何东西表明第一个 setosa 和第一个 virginica 之间有相关的配对,因此数据是不配对。不幸的是,通过将物种作为立方体的平面排列,它表明了这种配对的关系。

考虑一下:埃德加(Edgar)取而代之的是51 setosa 而不是50,但将其他两个物种保持在50,阵列的外观将如何?其中一架飞机比其他两个飞机高一点,而不是矩阵。如果他以不同的顺序对50 setosa 采样(因为没有说明订单很重要)。阵列将是不同的,观察第三余量(iris3[1,1,])的分析将返回不同的结果,但是实际数据确实没有改变。

因此,我相信它是在完美的3-D矩阵中的事实是为了处理多维数据,不是因为数据实际上属于该方向。

编辑

考虑到您想知道如何将(任何)数据从2D转换为3D数组,这是使用iris的示例。这是一个假设:

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

  2. 正如我上面讨论的那样,添加维度内的配对实际上是相关的。如果数据未配对,此过程可以正常工作,那么认为使用其他数据可能有不同的数据计数是完全合乎逻辑的。

  3. 相似(并绑定)与#2,所有类别都应具有相同数量的数据。如果您愿意接受NA的行扩展到较短的类别,则可以挥舞着,但对我来说似乎有些马虎。

基础r

首先,我们将当前的2D数据分组分组,方便(但必然)导致具有相同维度的元素(50 x 4)。-5删除了第五列$Species,因此我们使用as.matrix的下一步不会将numeric转换为character

irislist <- by(iris, iris$Species, `[`, -5)

根据源数据的维度预先填充3D阵列。

mtx <- array(NA, dim = c(dim(irislist[[1]]), length(irislist)))

这可能是通过*apply功能之一来完成的,但是我无法使其一般起作用。也许有人可以提出建议。

for (i in seq_along(irislist)) mtx[,,i] <- as.matrix(irislist[[i]])

制作了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...

abind

这也可以使用abind完成,而无需预先合同mtx,通过for循环或进行任何维度命名:

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"

总结

并不明显如何与您的数据一起使用。当我运行您的代码时,我最终得到了六列,其中只有一列(Data$G)似乎是您可以分为另一个维度的东西(即,看起来可能是分类的)。不幸的是:

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

和我的第三个子弹,这是行不通的。

最新更新