楼主: 三好牛牛
6421 3

[问答] R语言调用PMA包里的CCA函数,跪求大神指教 [推广有奖]

  • 0关注
  • 1粉丝

学前班

60%

还不是VIP/贵宾

-

威望
0
论坛币
0 个
通用积分
0
学术水平
0 点
热心指数
0 点
信用等级
0 点
经验
23 点
帖子
2
精华
0
在线时间
1 小时
注册时间
2013-12-6
最后登录
2014-10-27

楼主
三好牛牛 发表于 2014-10-27 15:40:06 |AI写论文

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币
输入是两个矩阵X,Z,其中X是888*635维的,Z是888*1385维的。
先是对X和Z做处理:
xmean <- apply(X,2,mean); zmean <- apply(Z,2,mean)
xsd <- apply(X,2,sd); zsd <- apply(Z,2,sd)
xsd[xsd==0] <- 1; zsd[zsd==0] <- 1

Xs <- X - matrix(xmean, nrow(X), ncol(X), byrow=T)
Zs <- Z - matrix(zmean, nrow(Z), ncol(Z), byrow=T)

Xs <- Xs * matrix(1/xsd, nrow(X), ncol(X), byrow=T)
Zs <- Zs * matrix(1/zsd, nrow(Z), ncol(Z), byrow=T)

然后调用PMA包中的CCA函数:
res <- CCA(x=Xs,z=Zs,typex="standard", typez="standard", penaltyx=0.04, penaltyz=0.04, niter=15, K=80, trace=T, standardize=F)
程序就会提示出错:Error in CheckVs(v, x, z, K) : Problem computing SVD.

其中CheckVs(v, x, z, K)是这样的:
CheckVs <- function(v,x,z,K){ # If v is NULL, then get v as appropriate.
  if(!is.null(v) && !is.matrix(v)) v <- matrix(v,nrow=ncol(z))
  if(!is.null(v) && ncol(v)<K) v <- NULL
  if(!is.null(v) && ncol(v)>K) v <- matrix(v[,1:K],ncol=K)
  if(is.null(v) && ncol(z)>nrow(z) && ncol(x)>nrow(x)){
    v <- matrix(fastsvd(x,z)$v[,1:K],ncol=K)
  } else if (is.null(v) && (ncol(z)<=nrow(z) || ncol(x)<=nrow(x))){
    v <- matrix(svd(t(x)%*%z)$v[,1:K],ncol=K)
  }
  return(v)
}

但是如果随机取X和Z的子集调用CCA就不会出错:
n <- nrow(X);  px <- ncol(X);  pz <- ncol(Z); nabs <- n
rsize <- trunc(n / 5)
index <- 1:n
# Create 5 training and test sets based on the entire dataset
for (r in 1:5){
        #Delete ids from the index list
        rindex <- sample(index, size=trunc(n/(6 - r)))   
        pindex.r <- rindex
        tindex.r <- (1:nabs)[-pindex.r]
        # Build training and test sets
        Xt <- X[tindex.r, ]
            Zt <- Z[tindex.r, ]

xmean <- apply(Xt,2,mean); zmean <- apply(Zt,2,mean)
        xsd <- apply(Xt,2,sd); zsd <- apply(Zt,2,sd)
        xsd[xsd==0] <- 1; zsd[zsd==0] <- 1

        Xts <- Xt - matrix(xmean, nrow(Xt), ncol(Xt), byrow=T)
        Zts <- Zt - matrix(zmean, nrow(Zt), ncol(Zt), byrow=T)

        Xts <- Xts * matrix(1/xsd, nrow(Xt), ncol(Xt), byrow=T)
        Zts <- Zts * matrix(1/zsd, nrow(Zt), ncol(Zt), byrow=T)

result_s.sca <- CCA(x=Xts, z=Zts, typex="standard", typez="standard", penaltyx=0.01, penaltyz=0.01,
                niter=15, K=80, trace=T, standardize=F)

这样调用就不会出错,可以正常计算。那么请问第一种情况下为什么会错呢?

二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

关键词:PMA R语言 mean

沙发
三好牛牛 发表于 2014-10-27 20:54:35
CheckVs()是 CCA的内部函数么?我把那段从程序中去掉一样会报相同的错误。

藤椅
DM小菜鸟 发表于 2014-12-10 14:26:49
不是CheckVs出的错,报错提示是奇异值分解出了错误。
你看下你的X和Z矩阵,有没有缺失值。



板凳
alaska1999 发表于 2015-12-11 10:42:51
楼主后来发现原因了吗?我也有类似问题。

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注cda
拉您进交流群
GMT+8, 2025-12-30 10:46