Функция SVD в R. Я хочу получить сингулярные значения $d из списка наборов данных. Я хочу поместить его в табличную форму

#r #svd

Вопрос:

Я хочу использовать функцию svd для получения особых значений больших наборов данных в списке. Когда я использую функцию svd в одной матрице, я могу использовать $d и получать значения, но для списка я не могу получить выходные данные. Вот код для матрицы и выходные данные.

      tb = matrix(c(64,  112,    59, 174,    111,    37,
              39,   135,    115,    92, 161,    70,
              93,   119,    50, 142,    20, 114,
              149,  191,    62, 17, 145,    21,
              60,   37, 29, 74, 42, 242), nrow = 5, ncol = 6, byrow = TRUE)




## Compute SVD of tb
#
     my_svd = svd(tb)

## Retrieve (save) singular values
#
     sv = my_svd$d

## Compute ratio between "1st/2nd" amp; "2nd/3rd" singular values
#
    ratios = matrix(c(sv[1]/sv[2], sv[2]/sv[3]), nrow = 1)
    colnames(ratios) = c("sv1/sv2", "sv2/sv3")

## Print ratios
ratios
 

Как мне применить это к списку наборов данных?
мой текущий код

      svdresult <- lapply(d1,svd)
     svdresult
 

d1-это мой список наборов данных

Как мне получить svdresult$d в списке наборов данных.

 Thanks in advance
 

Комментарии:

1. И составьте таблицу, как в приведенном выше коде, пожалуйста

Ответ №1:

Может быть, что-то вроде следующего?

 
get_svd_ratios <- function(data) {
  sv = svd(data)$d
  n = length(sv)
  ratios = matrix(sv[1:(n - 1)] / sv[2:n] , nrow = 1)
  names = paste(
    paste0("sv", 1:(n - 1)), 
    paste0("sv", 2:n), 
    sep = "/"
  )
  colnames(ratios) = names
  return(ratios)
}

lapply(list(tb), get_svd_ratios)

# [[1]]
#       sv1/sv2  sv2/sv3 sv3/sv4  sv4/sv5
# [1,] 2.261771 1.680403 1.29854 2.682195

 

Комментарии:

1. Большое спасибо. Это работает. Однако мне нужны только первые два. т. е. sv1/sv2, sv2/sv3. Как мне настроить код, пожалуйста.

2. Мне удалось скорректировать код. Большое спасибо.