1

私は自分のデータを処理するためにいくつかの(私にとって)非常に複雑なコードを適応させようとしています。

私の問題の核心は、2次元行列から始めると、変数の一部が次元を失うことだと思います。変数に次元を保持させる方法を知る必要があります。

私は2つの変数e(data.frame)から始めており、その一部は次のようになっています。

e <- 
structure(list(X2hr = c(0.106, 0, 0, 0, 0.01, 0.042), X6hr = c(1, 
0.083, 0.006, 0, 1, 0.967), X12hr = c(0.049, 0.057, 0.098, 0.405, 
0.046, 0.029), X24hr = c(0.264, 0.301, 0.025, 0.15, 0.58, 0.487
), X36hr = c(0.284, 1, 0.114, 1, 0.671, 1), X48hr = c(0.274, 
0.235, 0.299, 0.253, 0.617, 0.636), X72hr = c(0.098, 0.021, 1, 
0.325, 0.283, 0.35)), .Names = c("X2hr", "X6hr", "X12hr", "X24hr", 
"X36hr", "X48hr", "X72hr"), row.names = c("cgd1_10", "cgd1_100", 
"cgd1_1000", "cgd1_1010", "cgd1_1020", "cgd1_1030"), class = "data.frame")

およびm(1列2913行の2次元行列)、その一部は次のようになります。

m <- 
structure(c(0, 0, 1.174805088, 1.174805088, 0, 0), .Dim = c(6L, 
1L), .Dimnames = list(c("cgd1_10", "cgd1_100", "cgd1_1000", "cgd1_1010", 
"cgd1_1020", "cgd1_1030"), "X4_1110_2.motif2"))

glmnetパッケージをロードして、2つの関数を定義しIDC.glmnetますPBM.glmnet.getCoefs

library(glmnet)
IDC.glmnet <- function(e, m, mode="coef", randomize=F, alpha=0.5) {
  nona  <- !is.na(e)
  enona <- e[nona]
  mnona <- m[nona,]
  if(ncol(m)==1)
    dim(mnona) <- c(sum(nona),ncol=1)
  e.cv <- cv.glmnet( mnona, enona, nfolds=10)
  l <- e.cv$lambda.min
  #print(l)
  if (randomize == TRUE) {
    enona <- sample(enona)
  }
  e.fits <- glmnet( mnona, enona, family="gaussian", alpha=alpha, nlambda=100)
  if (mode == "predict") {
    cor.test(predict(e.fits, mnona, type="response", s=l), enona)$estimate
  } else {
    as.matrix(predict(e.fits, s=l, type="coefficients")[-1,])
  }
}

PBM.glmnet.getCoefs <- function(e, m, alpha=0.05, randomize=F, center=FALSE) {
  e.coef <<- apply(e, 2, IDC.glmnet, m, mode="coefficients",
                   alpha=alpha, randomize=randomize)
  if (dim(e)[2] > 1) { 
    e.coef.s <- t(apply(e.coef, 1, scale, center=center))
  } else {
    e.coef.s <- e.coef
  } 
  rownames(e.coef.s) <- colnames(m)
  colnames(e.coef.s) <- colnames(e)
  e.coef.s
}

次にPBM.glmnet.getCoefs、変数を実行しようとします。

coefs <- PBM.glmnet.getCoefs(e, m)

そして、次のエラーメッセージが表示されます。

Error in t(apply(e.coef, 1, scale, center = center)) : 
  error in evaluating the argument 'x' in selecting a method for function 't':
  Error in apply(e.coef, 1, scale, center = center) : 
    dim(X) must have a positive length

この問題は、に単一列の行列を使用すると発生しますm。複数の列がある場合は、正常に機能します。ただし、結果が歪むため、複数の列を使用することはできません。実際には、単一の列を使用できる必要がありますmPBM.glmnet.getCoefs私の限られたトラブルシューティング能力から、関数のこの行が問題の始まりだと思います。

e.coef <<- apply(e, 2, IDC.glmnet, m, mode="coefficients",
                 alpha=alpha, randomize=randomize)

e.coef単一列を使用する場合のベクトルmです。次に、e.coefは無次元であるため、t(apply)上記のエラーが発生します。

e.coefこのように見えます:

> e.coef   
        X2hr         X6hr        X12hr        X24hr        X36hr        X48hr 
 0.025701875  0.004066947  0.043836383  0.020151361  0.003512643 -0.035211133 
       X72hr 
-0.034503722 

e.coef適切なディメンション(1行7列、一番上の行から取得した列見出しe、関数のどこかで決定された行の値)が保持されていることを確認するにはどうすればよいIDC.glmnetですか?

4

1 に答える 1

1

問題の原因となっている行を正しく特定しました。この問題は、「'MARGIN'の長さが1の場合、'apply'はベクトルを返します」の「」セクションで説明されています。?apply

したがって、この小さな変更を行って、寸法が正しいことを確認してください。

PBM.glmnet.getCoefs <-
function(e, m, alpha=0.05, randomize=F, center=FALSE ) {
   e.coef <<- apply(e, 2, IDC.glmnet, m, mode="coefficients",
                    alpha=alpha, randomize=randomize)
   dim(e.coef) <<- c(ncol(m), ncol(e))
   if (dim(e)[2] > 1) { 
     e.coef.s <- t(apply(e.coef, 1, scale, center=center))
   } else {
     e.coef.s <- e.coef
   }    
   rownames(e.coef.s) <- colnames(m)
   colnames(e.coef.s) <- colnames(e)
   e.coef.s
}
于 2012-06-28T22:24:03.833 に答える