Можно ли фильтровать данные по их графику / прогнозируемой кривой?

У меня возник вопрос об исключении / фильтрации точек данных. В настоящее время я закодировал логистическую регрессию, которая генерирует границу решения, которая превращается в функцию, в которой я могу обрабатывать подмножества моего фрейма данных.

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

## glm that generates a midpoint/decision boundary, wrapped into a function

get_midpoint = function(data){
      glm.1 = glm(coderesponse~stimulus, family = binomial(link="logit"), data=data, na.action = na.exclude)
      rtn = -glm.1$coefficients[1]/glm.1$coefficients[2]
rtn
}

## a mini dummy dataframe 

subject <- c(1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2)
stimulus = c(1, 5, 50, 35, 23, 2, 4, 22, 15, 6, 20, 40, 45, 10, 37, 43, 48, 7, 19, 21, 29, 49, 26, 11, 36, 30, 39, 41, 16, 37, 1, 5, 50, 35, 23, 2, 4, 22, 15, 6, 20, 40, 45, 10, 37, 43, 48, 7, 19, 21, 29, 49, 26, 11, 36, 30, 39, 41, 16, 37)
stim <- c('bd', 'nd', 'nm', 'bd', 'nd', 'nm', 'bd', 'nd', 'nm', 'bd', 'nd', 'nm', 'bd', 'nd', 'nm', 'bd', 'nd', 'nm', 'bd', 'nd', 'nm', 'bd', 'nd', 'nm', 'bd', 'nd', 'nm', 'bd', 'nd', 'nm', 'bd', 'nd', 'nm', 'bd', 'nd', 'nm', 'bd', 'nd', 'nm', 'bd', 'nd', 'nm', 'bd', 'nd', 'nm', 'bd', 'nd', 'nm', 'bd', 'nd', 'nm', 'bd', 'nd', 'nm', 'bd', 'nd', 'nm', 'bd', 'nd', 'nm')
block <- c('mouth', 'mouth', 'mouth', 'nose', 'nose', 'nose', 'mouth', 'mouth', 'mouth', 'nose', 'nose', 'nose', 'mouth', 'mouth', 'mouth', 'nose', 'nose', 'nose', 'mouth', 'mouth', 'mouth', 'nose', 'nose', 'nose', 'mouth', 'mouth', 'mouth', 'nose', 'nose', 'nose', 'mouth', 'mouth', 'mouth', 'nose', 'nose', 'nose', 'mouth', 'mouth', 'mouth', 'nose', 'nose', 'nose', 'mouth', 'mouth', 'mouth', 'nose', 'nose', 'nose', 'mouth', 'mouth', 'mouth', 'nose', 'nose', 'nose', 'mouth', 'mouth', 'mouth', 'nose', 'nose', 'nose')
coderesponse <- c(1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 0, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 0)

df = data.frame(subject, stimulus, stim, block, coderesponse)

## running the function over defined subgroups of ~80 rows each [for the real data]
## but for the dummy dataframe, only ~5 rows

df = df %>% 
  nest(data=-c(subject, stim, block)) %>%
  mutate(midpoint=map_dbl(data, get_midpoint)) %>%
  unnest()

## basic code that plots and creates a curve based on a single glm result
## QUESTION: want to be able to run this over the same subgroups as above to create curves for every midpoint generated and then possibly filter based on the curve?
plot(df$stimulus,df$coderesponse,xlab="stimulus",ylab="Probability of d responses")
curve(predict(glm.1,data.frame(stimulus=x),type="response"),add=TRUE)

Я новичок и запутался в этой части R, поэтому спасибо за любую помощь или понимание!


person LizJu    schedule 01.12.2020    source источник
comment
Вам будет легче помочь, если вы включите простой воспроизводимый пример с образцом ввода и желаемым выходом, которые можно использовать для тестирования и проверки возможных решений. Немного непонятно, что вы описываете.   -  person MrFlick    schedule 01.12.2020
comment
Отредактировано! Надеюсь, это проясняет ситуацию.   -  person LizJu    schedule 01.12.2020
comment
При запуске я получаю object 'glm.1' not found ошибку в последней строке. Я вижу модель, встроенную в get_midpoint() fx, используемую в вашем mutate, но вы нигде не возвращаете модель glm.1.   -  person Steven    schedule 02.12.2020
comment
@Steven, извините, последний фрагмент кода (например, строки, касающиеся прогноза plot & curve) применим только к одному выходу из модели glm.1. Я пытаюсь понять, как изменить его для вывода графика и кривых в соответствии со значениями, сгенерированными функцией get_midpoint(), с которой у меня все еще возникают проблемы. edit: Можно ли построить все значения glm.1 из подгрупп данных с помощью ggplot или для этого требуется какая-то функция?   -  person LizJu    schedule 02.12.2020
comment
@LizJu Я все еще не уверен, правильно ли понимаю, что вы ищете. Мне кажется, что вы хотите смоделировать coderesponse~stimulus как glm, сгруппировать по subject, а затем нанести данные и каждую модель на один и тот же рисунок. Если это так, то легко. ggplot() может построить для вас модели. Если это что-то еще, мне не хватает ключевого компонента для моего понимания.   -  person Steven    schedule 02.12.2020


Ответы (1)


Я думаю, что вы пытаетесь сделать следующее:

library(ggplot2)
library(dplyr)

df %>%
  ggplot() +
  aes(x = stimulus, y = coderesponse, colour = subject %>% as.factor()) +
  geom_point() +
  geom_smooth(method = 'glm', method.args = list(family = binomial(link='logit')), se = F) +
  scale_colour_discrete(name = "Subject") +
  theme(legend.position = "bottom")

введите описание изображения здесь

Это берет ваш исходный df и просто отображает данные, окрашенные subject, а затем запускает glm модель по обеим subject группам ваших данных. Вы можете запускать каждый glm вне оператора geom_smooth(), если вам нужно использовать их для прогнозирования. Может быть способ использовать модели, произведенные ggplot, без дополнительных вычислений при ремоделировании.

person Steven    schedule 02.12.2020