#r #dataframe #matrix #tidyr #self-organizing-maps
Вопрос:
Как создать ежедневную числовую матрицу из фрейма данных с x
, y
date
, и value
столбцами. Я пытаюсь реализовать функцию SOM из пакета Кохонена в R для моего фрейма данных dtt
. Для этого требуется матрица данных в качестве входных данных. Итак, как я могу преобразовать dtt
в ежедневную матрицу на основе групп x и y, чтобы реализовать функцию SOM? Примеры данных и кода.
dtt <-structure(list(x = c(-175, -174, -176, -175, -174, -173, -177,
-176, -176, -175, -175, -174, -174, -173, -173, -178, -177, -176,
-175, -174, -173, -178, -177, -176, -175, -174, -173, -177, -176,
-175), y = c(55, 55, 54, 54, 54, 54, 53, 53, 53, 53, 53, 53,
53, 53, 53, 52, 52, 52, 52, 52, 52, 51, 51, 51, 51, 51, 51, 50,
50, 50), date = structure(c(9651, 9651, 9651, 9651, 9651, 9651,
9652, 9651, 9652, 9651, 9652, 9651, 9652, 9651, 9652, 9652, 9652,
9652, 9652, 9652, 9652, 9652, 9652, 9652, 9652, 9652, 9652, 9652,
9652, 9652), class = "Date"), value = c(316.613647460938, 316.79248046875,
317.312530517578, 318.800598144531, 318.795593261719, 317.331817626953,
317.249206542969, 317.226287841797, 320.043701171875, 318.493255615234,
321.331146240234, 318.14208984375, 321.068939208984, 316.213836669922,
319.203460693359, 316.927764892578, 320.787109375, 323.020355224609,
323.617523193359, 322.588897705078, 319.979583740234, 318.035278320312,
321.262054443359, 322.785919189453, 322.615661621094, 320.828125,
317.512573242188, 318.32177734375, 319.274078369141, 318.411285400391
)), row.names = c(NA, -30L), class = c("tbl_df", "tbl", "data.frame"
))
Неудачный код для преобразования в матрицу.
dtt_mat <- dtt %>%
group_by(x, y)%>%
mutate(value = scale(value))%>%
unite("xy", c(x,y), sep = "_") %>%
tidyr::pivot_wider(names_from = xy, values_from = value)%>%
dplyr::select(-date) %>%
as.matrix()
dtt_mat
str(dtt_mat)
Реализация SOM выдает ошибку, поскольку матрица dtt_mat не является правильной
library(kohonen)
som_res <- som(X = dtt_mat,
grid = somgrid(xdim = 2, ydim = 2, topo = "rectangular"),
keep.data = T)
som_res
Комментарии:
1.
NaN
Послеscale
i. e есть некоторые значения, где количество элементов в группах равно 12. Процент
NA
в данных очень высокrowMeans(is.na(dtt_mat))# [1] 0.8461538 0.8461538
, гдеmaxNA.fraction
по умолчанию 0, т. е.the maximal fraction of values that may be NA to prevent the row to be removed.
Ответ №1:
Вы можете использовать data.matrix()
.
library('kohonen')
som_res <- som(X=data.matrix(dtt),
grid=somgrid(xdim=2, ydim=2, topo="rectangular"),
keep.data=T)
som_res
# SOM of size 2x2 with a rectangular topology.
# Training data included.
str(som_res)
# List of 13
# $ data :List of 1
# ..$ : num [1:30, 1:4] -175 -174 -176 -175 -174 -173 -177 -176 -176 -175 ...
# .. ..- attr(*, "dimnames")=List of 2
# .. .. ..$ : NULL
# .. .. ..$ : chr [1:4] "x" "y" "date" "value"
# $ unit.classif : num [1:30] 4 4 4 4 3 3 4 4 2 4 ...
# $ distances : num [1:30] 2.257 3.86 0.378 1.932 2.422 ...
# $ grid :List of 6
# ..$ pts : int [1:4, 1:2] 1 2 1 2 1 1 2 2
# .. ..- attr(*, "dimnames")=List of 2
# .. .. ..$ : NULL
# .. .. ..$ : chr [1:2] "x" "y"
# ..$ xdim : num 2
# ..$ ydim : num 2
# ..$ topo : chr "rectangular"
# ..$ neighbourhood.fct: Factor w/ 2 levels "bubble","gaussian": 1
# ..$ toroidal : logi FALSE
# ..- attr(*, "class")= chr "somgrid"
# $ codes :List of 1
# ..$ : num [1:4, 1:4] -174.8 -176.7 -173.3 -175.4 51.9 ...
# .. ..- attr(*, "dimnames")=List of 2
# .. .. ..$ : chr [1:4] "V1" "V2" "V3" "V4"
# .. .. ..$ : chr [1:4] "x" "y" "date" "value"
# $ changes : num [1:100, 1] 0.249 0.193 0.177 0.167 0.158 ...
# $ alpha : num [1:2] 0.05 0.01
# $ radius : Named num [1:2] 1 0
# ..- attr(*, "names")= chr [1:2] "66.66667%" ""
# $ user.weights : num 1
# $ distance.weights: num 1
# $ whatmap : int 1
# $ maxNA.fraction : int 0
# $ dist.fcts : chr "sumofsquares"
# - attr(*, "class")= chr "kohonen"