我试图使用特征值方法检查我的矩阵是否是奇异的(即,如果其中一个特征值为零,那么矩阵是奇异的).这是代码:
z <- matrix(c(-3,2,1,4,-9,6,3,12,5,5,9,4),nrow=4,ncol=3)
eigen(t(z)%*%z)$values
Run Code Online (Sandbox Code Playgroud)
我知道特征值按降序排序.如果有办法找出特征值与矩阵中的哪个列相关联,有人可以告诉我吗?我需要删除共线列.
在上面的示例中可能很明显,但它只是一个示例,旨在为您节省创建新矩阵的时间.
我是R和for循环的新用户.我试图从数据中取样并检查是否有共线柱.我想在该迭代中记录共线列存在并将其记录在向量中(baditr).另外,我想打印一行表示"colinearity is iteration i".然后我希望代码跳转到第二次迭代并继续运行.对于每次迭代,我希望代码保存矩阵的相应行中的列的总和.
我的问题是,我正在为不良迭代获得NA.我的目的是将错误的迭代完全包含在我的矩阵中.这是我的代码:
a0=rep(1,40)
a=rep(0:1,20)
b=c(rep(1,20),rep(0,20))
c0=c(rep(0,12),rep(1,28))
c1=c(rep(1,5),rep(0,35))
c2=c(rep(1,8),rep(0,32))
c3=c(rep(1,23),rep(0,17))
da=matrix(cbind(a0,a,b,c0,c1,c2,c3),nrow=40,ncol=7)
sing <- function(nrw){
sm <- matrix(NA,nrow=nrw,ncol=ncol(da))
baditr <- NULL
for(i in 1:nrw){
ind <- sample(1:nrow(da), nrow(da),replace =TRUE)
smdat <- da[ind,]
evals <- eigen(crossprod(smdat))$values
if(any(abs(evals) < 1e-7)){
baditr <- c(baditr,i)
cat("singularity occurs at", paste(i),"\n")
next
}
sm[i,] <- apply(smdat,2,sum)
}
return(sm)
}
sing(20)
Run Code Online (Sandbox Code Playgroud)
我将得到以下输出:
singularity occurs at 9
singularity occurs at 13
[,1] [,2] [,3] [,4] [,5] [,6] [,7]
[1,] 40 23 22 25 5 8 26
[2,] …Run Code Online (Sandbox Code Playgroud) 你可以向我解释为什么代码抱怨说Samdat找不到?
我试图在模型之间切换,所以我声明了一个包含这些特定模型的函数,我只需要将此函数作为函数中的一个参数调用,get.f其中重新采样将改变模型中每个设计矩阵的结构.代码抱怨Samdat发现时找不到.
另外,有没有办法可以创建条件语句if(Model == M1())而不必创建另一个参数M来设置if(M==1)?
这是我的代码:
dat <- cbind(Y=rnorm(20),rnorm(20),runif(20),rexp(20),rnorm(20),runif(20), rexp(20),rnorm(20),runif(20),rexp(20))
nam <- paste("v",1:9,sep="")
colnames(dat) <- c("Y",nam)
M1 <- function(){
a1 = cbind(Samdat[,c(2:5,7,9)])
b1 = cbind(Samdat[,c(2:4,6,8,7)])
c1 = b1+a1
list(a1=a1,b1=b1,c1=c1)}
M2 <- function(){
a1= cbind(Samdat[,c(2:5,7,9)])+2
b1= cbind(Samdat[,c(2:4,6,8,7)])+2
c1 = a1+b1
list(a1=a1,b1=b1,c1=c1)}
M3 <- function(){
a1= cbind(Samdat[,c(2:5,7,9)])+8
b1= cbind(Samdat[,c(2:4,6,8,7)])+8
c1 = a1+b1
list(a1=a1,b1=b1,c1=c1)}
#################################################################
get.f <- function(asim,Model,M){
sse <-c()
for(i in 1:asim){
set.seed(i)
Samdat <- dat[sample(1:nrow(dat),nrow(dat),replace=T),]
Y <- Samdat[,1]
if(M==1){ …Run Code Online (Sandbox Code Playgroud) 我在R中有这个数据集
dd=data.frame(
main=c("G","G","G","R","R","R","Y","Y","Y"),test=c(0,1,1,0,1,1,0,1,1),
a = c(1,0,0,2,0,0,3,0,0), b= c(0,3,0,0,6,0,0,4,0), c=c(0,0,5,0,0,8,0,0,9))
Run Code Online (Sandbox Code Playgroud)
我想看起来像这样
main test a b c
[1,] G 1 1 3 5
[2,] R 1 2 6 8
[3,] Y 1 3 4 9
Run Code Online (Sandbox Code Playgroud)
我有一些代码,但它不能正常工作.
你帮忙很多