Автоматическая подстановка кадра данных на основе матрицы прогнозирования - PullRequest
0 голосов
/ 08 декабря 2018

Я создал матрицу прогнозирования для большого набора данных следующим образом:

library(mice)
dfpredm <- quickpred(df, mincor=.3)

    A   B   C   D   E   F   G   H   I   J
A   0   1   1   1   0   1   0   1   1   0
B   1   0   0   0   1   0   1   0   0   1
C   0   0   0   1   1   0   0   0   0   0
D   1   0   1   0   0   1   0   1   0   1
E   0   1   0   1   0   1   1   0   1   0
**F 0   0   1   0   0   0   1   0   0   0**
G   0   1   0   1   0   0   0   0   0   0
H   1   0   1   0   0   1   0   0   0   1
I   0   1   0   1   1   0   1   0   0   0
J   1   0   1   0   0   1   0   1   0   0

Я хотел бы создать подмножество исходного df на основе dfpredm.

Подробнеев частности, я хотел бы сделать следующее:

Давайте предположим, что моя зависимая переменная F.Согласно матрице прогнозирования F соотносится с C и G. Кроме того, C и G лучше всего прогнозируются по D, E и B, D. соответственно.

Идея заключается в создании подмножества dfна основе зависимой переменной F, для которой в строке F значение равно 1.

Fpredictors <- df[,(dfpredm["F",]) == 1]

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

Fpredcol <-colnames(dfpredm[,(dfpredm["c241",]) == 1])

И затем сделать for loop с этими именами столбцов?

Для конкретного примера я хотел бы получить подмножество.

dfsub <- df[,c("F","C","G","B","E","D")]

Я бы хотел автоматизировать этот процесс.Может ли кто-нибудь показать мне, как это сделать?

1 Ответ

0 голосов
/ 08 декабря 2018

Вот одна стратегия, которая, кажется, будет работать для вас:

first_preds <- function(dat, predictor) {
  cols <- which(dat[predictor, ] == 1)
  names(dat)[cols]
}

# wrap first_preds() for getting best and second best predictors
first_and_second_preds <- function(dat, predictor) {
  matches <- first_preds(dat, predictor)
  matches <- c(matches, unlist(lapply(matches, function(x) first_preds(dat, x))))
  c(predictor, matches) %>% unique()
}

dat[first_and_second_preds(dat, "F")] # order is not exactly the same as your output

  F C G D E B
A 1 1 0 1 0 1
B 0 0 1 0 1 0
C 0 0 0 1 1 0
D 1 1 0 0 0 0
E 1 0 1 1 0 1
F 0 1 1 0 0 0
G 0 0 0 1 0 1
H 1 1 0 0 0 0
I 0 0 1 1 1 1
J 1 1 0 0 0 0

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

Использование dat отсюда (более удобный способ обмена небольшими данными R на SO):

dat <- read.table(
  text = "A   B   C   D   E   F   G   H   I   J
  A   0   1   1   1   0   1   0   1   1   0
  B   1   0   0   0   1   0   1   0   0   1
  C   0   0   0   1   1   0   0   0   0   0
  D   1   0   1   0   0   1   0   1   0   1
  E   0   1   0   1   0   1   1   0   1   0
  F   0   0   1   0   0   0   1   0   0   0
  G   0   1   0   1   0   0   0   0   0   0
  H   1   0   1   0   0   1   0   0   0   1
  I   0   1   0   1   1   0   1   0   0   0
  J   1   0   1   0   0   1   0   1   0   0",
  header = TRUE
)

Нечто более общее, что позволило бы вам напрямую использовать self_select предикторы:

all_preds <- function(dat, predictors) {
  unlist(lapply(predictors, function(x) names(dat)[which(dat[x, ] == 1 )]))
}

dat[all_preds(dat, c("A", "B"))]

  B C D F H I A E G J
A 1 1 1 1 1 1 0 0 0 0
B 0 0 0 0 0 0 1 1 1 1
C 0 0 1 0 0 0 0 1 0 0
D 0 1 0 1 1 0 1 0 0 1
E 1 0 1 1 0 1 0 0 1 0
F 0 1 0 0 0 0 0 0 1 0
G 1 0 1 0 0 0 0 0 0 0
H 0 1 0 1 0 0 1 0 0 1
I 1 0 1 0 0 0 0 1 1 0
...