Итерировать два аргумента с map2 (функция purrr) - PullRequest
0 голосов
/ 26 января 2019

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

df<-iris
df$y<-sample(0:1,nrow(df),replace=TRUE)
set.seed(101)
#Now Selecting 80% of data as sample from total 'n' rows of the data  
sample <- sample.int(n = nrow(df), size = floor(.8*nrow(df)), replace = F)
train <- df[sample, ]
test  <- df[-sample, ]

Затем я создаю логистическую модель:

 full <- glm(y~., data = train, family = "binomial")
 min <- glm( y~ 1, data = train, family = "binomial")

 backward <- step(full,direction = "backward",trace=0)
 forward <- step(min,scope=list(lower=min, upper=full),direction = "forward",trace=0)
model2<- glm(y~Sepal.Length+Sepal.Width , data = train, family = "binomial")

  models<-list(backward,forward,model2)
prediction<- lapply(models, function(x){predict(x,newdata=test,type="response")})

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

    p <- seq(from = 0.1, to = 0.9, by = 0.5) 

Проблема в том, что я хочу применить разницу точек разрыва. Я попытался с функцией map2 пакета purrr, но она не работает.

    pred = map2(prediction,p, function(x,pi){ifelse(x > pi, 1, 0)})

Проблема в следующем: Ошибка: .x (3) и .y (2) имеют разную длину

Кто-нибудь может помочь?

Я думаю, что лучше всего применить применить к sapply, тогда у меня будет data.frame.

  prediction<- sapply(models, function(x){predict(x, newdata=test,type="response")},
                        simplify = T,USE.NAMES = TRUE)

Тогда я мог бы использовать функцию pmap? спасибо

РЕДАКТИРОВАТЬ: я обновил со всем кодом.

1 Ответ

0 голосов
/ 26 января 2019

Посмотрите, имеет ли это смысл:

df<-iris
df$y<-sample(0:1,nrow(df),replace=TRUE)
set.seed(101)
#Now Selecting 80% of data as sample from total 'n' rows of the data  
sample <- sample.int(n = nrow(df), size = floor(.8*nrow(df)), replace = F)
train <- df[sample, ]
test  <- df[-sample, ]

full <- glm(y~., data = train, family = "binomial")
min <- glm( y~ 1, data = train, family = "binomial")

backward <- step(full,direction = "backward",trace=0)
forward <- step(min,scope=list(lower=min, upper=full),direction = "forward",trace=0)
model2<- glm(y~Sepal.Length+Sepal.Width , data = train, family = "binomial")

models<-list(backward,forward,model2)
prediction<- lapply(models, function(x){predict(x,newdata=test,type="response")})

p <- seq(from = 0.1, to = 0.9, by = 0.5) 

combn = cross2(prediction, p)

pred <- map(combn, 
            function(combination) {
              x <- combination[[1]]
              pi <- combination[[2]]
              ifelse(x > pi, 1, 0)
            }
)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...