我正在尝试使用 mvnormtest 包对我的数据进行多变量正态性测试,其中包含两个对象间变量,一个对象内变量和三个因变量(二进制分类)。我的数据看起来像这样(〜5,600行,没有丢失的数据):
Cluster Group Trial Measure Measure2 Measure
1 4 1 1 1 0
1 4 1 0 0 0
1 4 1 1 1 0
1 4 1 1 1 0
1 4 1 1 1 1
1 4 1 1 1 1
1 4 1 1 1 0
1 4 1 1 1 0
这是我的设置:
data.df <- read.csv(
"data.csv",
header=TRUE, sep=","
)
attach(data.df)
names(data.df)
我尝试了以下 mshapiro.test()
#multivariate normality
dataMat <- data.matrix(data.df)
mshap <- mshapiro.test(dataMat)
我收到以下错误:
Error in solve.default(R %*% t(R), tol = 1e-18):
Lapack routine dgesv: system is exactly singular: U[7,7] = 0.
一年前,我在一次统计课程中查看了一个论坛,发现有人可以通过将数据分组来进行工作。
LowCluster <- t(dataMat[c(1:1877),1:6])
MedCluster <- t(dataMat[c(1878:3166),1:6])
HigCluster <- t(dataMat[c(3167:5364),1:6])
mshaplow <- mshapiro.test(LowCluster)
mshapmed <- mshapiro.test(MedCluster)
mshaphigh <- mshapiro.test(HigCluster)
我遇到了同样的错误。
Error in solve.default(R %*% t(R), tol = 1e-18) :
Lapack routine dgesv: system is exactly singular: U[7,7] = 0
我该如何解决?
答案 0 :(得分:2)
几个问题。首先,mshapiro.test
函数要求数据为行格式,因此您需要使用t()
来转置数据。
但是由于奇异矩阵,它仍然会失败,因为您的列彼此完全是线性组合。例如,Group
等于4*Cluster
,而Measure
与Measure2
相同。查阅this discussion关于奇异矩阵的更多信息。
假设您只想测试Measure
变量的正态性,下面的代码示例将说明奇异矩阵的问题:
df2 <- data.df[,c(4, 5, 6)]
df2[8,1] = 0 # changing this value makes it so no column is a linear combo of any other column
mshapiro.test(t(df2))
但是您所有的Measure
值都是0还是1?如果是这样,为什么还要测试正常性?