r - mshapiro.test 'solve.default(R %*% t(R), tol = 1e-18) 中的错误:Lapack 例程 dgesv:系统完全是奇异的:U[7,7] = 0'
问题描述
我正在尝试使用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
我该如何解决这个问题?
解决方案
几个问题。首先,该mshapiro.test
函数要求数据为行格式,因此您需要使用t()
转置数据。
但是它仍然会由于奇异矩阵而失败,因为您的列是彼此完全线性组合的。例如,Group
等于4*Cluster
, 和Measure
相同Measure2
。查看有关奇异矩阵的讨论以获取更多信息。
假设您只想测试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?如果是这样,您为什么要测试正态性?
推荐阅读
- javascript - Firebase - 使用“Firebase Functions”将静态 html 项目文件夹上传到“Firebase Hosting”并提供服务?
- java - 弹簧休息模板中的未知 mime 类型?
- c - 并发:如何同时处理在两个不同内核上的两个线程中运行的单个函数(指令集)?
- c# - WPF:在执行期间显示图像
- sql - 重命名 ASP.NET SQL 表
- scala - Spark 无法将 String 转换为 TIMESTAMP
- javascript - 尝试使用 For 函数获取一些信息
- angular-cli - Angular CLI 构建 SourceMaps,但不部署它们
- swift - 添加为子视图的 UILabel 数量遇到限制
- c++ - 如何在不使图像变暗的情况下将 int16 Pixel 转换为 uint16 Pixel