2012-06-27 3 views
1

Я пытаюсь адаптировать некоторые (для меня) очень сложные коды для работы с моими данными.изменение переменных сохраняются в R

Я думаю, что суть моей проблемы в том, что некоторые из моих переменных теряют измерение, когда я начинаю с двумерной матрицы, и мне нужно знать, как заставить переменные сохранять свои измерения.

Я начиная с двумя переменными, 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 (2-мерная матрица, с одной колонной и 2913 строк) , часть которого выглядит следующим образом:

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 определить две функции, 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 , Если у меня несколько столбцов, он работает нормально. Но я не могу использовать несколько столбцов, потому что это искажает результаты, и мне действительно нужно иметь возможность использовать один столбец m. Из моих ограниченных способностей по устранению неполадок, я думаю, что эта линия в функции PBM.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 функция)?

+1

, не глядя слишком тщательно: общий ответ, вероятно, будет использовать 'падение = false' аргумент оператора индексации' [ ': см. '?" ["' и поиск "drop" –

ответ

1

Вы правильно определили строку, вызывающую проблему. Проблема описана в разделе Значение раздела ?apply: «'apply' возвращает вектор, если« MARGIN »имеет длину 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) 
    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 
} 
+0

Спасибо, это очень ясно! – ninjait

Смежные вопросы