随着时间的推移重复逻辑回归

问题描述 投票:0回答:1

我有一个人员数据集,我知道他们的年龄、地址和过去的行为。我知道他们采取某种行动的日期,并且我正在尝试创建一个逻辑回归模型来确定谁最有可能在任何给定的一天采取该行动。

我能做的是为每一天创建一个数据框,如下所示。注意 - 性别随着时间的推移保持不变,事件是过去一些行为的总和,我认为这些行为更有可能导致结果,地址可能会改变,结果是预测的“这个人是否做了我想要预测的事情”在这一天?”。下面的示例是两个不同日期的数据可能的样子。

我可以为每一天创建一个逻辑回归模型,并添加如下概率。

然而,我的数据包含数年来的数千人和事件。我最终想做的是每天按概率对前 1%、2% 和 3% 进行顶级切片,并将预测的个体与另一个预测模型进行比较。

问题是我无法为每一天创建一个数据框并为每一天生成一个单独的模型,有数千天。有没有某种方法可以自动生成每天的逻辑回归模型。

day_one_data = data.frame(sex=c(1, 0, 1, 1, 1, 0, 1, 0),
events=c(0, 1, 0, 4, 2, 0, 1, 0),
age=c(21, 18, 40, 18, 19, 35, 22, 39),
address=c(4, 1, 2, 3, 3, 1, 3, 4),
outcome=c(0, 0, 0, 1, 1, 1, 0, 0)
)

model <- glm(outcome~sex+events+age+address, family = "binomial",  data=day_one_data)

day_one_data$outcome_prob <- predict(model, day_one_data, type="response")

day_two_data = data.frame(sex=c(1, 0, 1, 1, 1, 0, 1, 0),
events=c(1, 2, 1, 6, 2, 0, 1, 0),
age=c(22, 19, 40, 18, 20, 36, 22, 40),
address=c(4, 1, 2, 3, 3, 1, 3, 3),
outcome=c(1, 1, 0, 1, 1, 1, 0, 0)
)

model_two <- glm(outcome~sex+events+age+address, family = "binomial",  data=day_two_data)

day_two_data$outcome_prob <- predict(model_two, day_two_data, type="response")

r logistic-regression glm predictive
1个回答
0
投票

您可以在循环中拟合模型,根据需要对数据进行子集化,并且仅存储您想要保留的结果 - 您提到每天的前 1%、2% 和 3$。

## create a vector of days that you want to model
days = seq(from = as.Date("2021-01-01", to = as.Date("2023-10-16")

## create a list to store the results
results = list() 

## fit your models and store your predictions
for(i in seq_along(days_to_model)) {
  ## fit the model to earlier data
  day_model = glm(
    outcome ~ sex + events + age + address,
    family = "binomial",
    data = subset(full_data, date < days[i])
  )

  ## predict on the current day
  prediction = subset(full_data, date = days[i])
  predict$pred = predict(
    day_model, 
    newdata = subset(full_data, date == days[i]),
    type = "response")
  )
 
  ## calculate quantiles
  prediction$quantile = cut(
    prediction$pred,
    breaks = quantile(predict$pred, probs = c(0, 0.97, 0.98, 0.99, 1)),
    labels = c("low", "97 %tile", "98 %tile", "99 %tile")
  )

  ## drop all below 97th %tile
  prediction = subset(prediction, quantile != "low")

  ## maybe drop other unneeded columns??

  ## keep the rest
  results[[i]] = prediction  
}
© www.soinside.com 2019 - 2024. All rights reserved.