разбить разреженную матрицу на линейные независимые подматрицы для регрессии - PullRequest
0 голосов
/ 10 сентября 2018

Проблема: Сокращение набора данных, используемого в регрессии, до нескольких меньших наборов, где переменные зависят внутри матрицы, но не зависят друг от друга. У меня большой набор данных с 1000 фиктивных переменных, но только несколько «положительных» для каждой строки, и память ограничивает мою способность строить разные модели. Поэтому я пытаюсь разбить набор данных на наборы, в которых существует линейная зависимость между переменными в наборе, но нет зависимости от других наборов.

Маленький пример:

M1 <- c(1L,0L,0L,0L,1L,1L,0L,0L,0L,0L,1L,1L,0L,0L,1L,0L)
dim(M1) <- c(4,4)

Здесь M1 можно разбить на две независимые матрицы:

M2 <- c(1,0,1,1)
M3 <- c(1,1,1,0)

Но меняя M1 на

M1[3,2] <- 1

Делает все строки зависимыми, поэтому разделение невозможно.

В идеале мне бы хотелось, чтобы вектор длины (nr строк) определял, к какому подмножеству относится строка, чтобы регрессии могли применяться к каждому подмножеству. Таким образом, результатом в исходном случае будет вектор:

R <- c(1,1,2,2)

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

1 Ответ

0 голосов
/ 11 сентября 2018

Итерация по матрице - это решение, которое реализуется следующими функциями (только 2d). Не красиво, и не используется матричная информация. Но размещено как способ решения проблемы:

`%ni%` <- Negate(`%in%`)
data <- hjlpmidMatrix


getRow <- function(data, col)
  {
    as.vector(which(data[,col] == 1))

  }
getCol <- function(data, row)
{
    as.vector(which(data[row,] == 1))
}


splitmatrix <- function(data) {
if (!is.matrix(data)) {
  stop("no data frame assigned to function")
  }
if (dim(data)[2] < 1) {
  stop("no columns in data")
}
vector <- dim(c(1,2))
i <- 1
col <- 1

repeat {
  rowIndex <- NULL
  colIndex <- NULL
repeat {
col <- col[col %ni% colIndex]
if (is_empty(col)) {break}
colIndex <- c(colIndex, col)
if (length(col) != 0) { row <- sapply(col,FUN = getRow, data = data) %>% unlist %>% unique()}

row <- row[row %ni% rowIndex]
if (is_empty(row)) {break}
  rowIndex <- c(rowIndex, row)
if (length(row) != 0) { col <- sapply(row,FUN = getCol, data = data) %>% unlist %>% unique()}

}

vector <- rbind(vector, cbind(i, rowIndex))
if (dim(vector)[1] < dim(data)[1])
  {
  i <- i + 1
  col <- (1:dim(data)[2])[1:dim(data)[2] %ni% colIndex]
}
else
  {break}
}
return(vector[,1])

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...