【问题标题】:How to graph my multiple linear regression model (caret)?如何绘制我的多元线性回归模型(插入符号)?
【发布时间】:2018-07-24 12:23:53
【问题描述】:

我创建了一个多元线性回归模型,现在想绘制它。但我似乎无法弄清楚。任何帮助将不胜感激!我使用 baruto 查找特征属性,然后使用 train() 获取模型。当我尝试绘制 model_lm 时出现错误:

There are no tuning parameters with more than 1 value.

这是我迄今为止尝试过的代码:

rt_train <- rttotal2
rt_train$year <- NULL
#rt_train$box_office <- NULL
#impute na and address multicoliniearity 
preproc <- preProcess(rt_train, method = c("knnImpute","center",
                                           "scale"))
rt_proc <- predict(preproc, rt_train)
rt_proc$box_office <- rt_train$box_office
sum(is.na(rt_proc))

titles <- rt_proc$titles
rt_proc$titles <- NULL
#rt_train$interval <- as.factor(rt_train$interval)

dmy <- dummyVars(" ~ .", data = rt_proc,fullRank = T)
rt_transform <- data.frame(predict(dmy, newdata = rt_proc))

index <- createDataPartition(rt_transform$interval, p =.75, list = FALSE)
train_m <- rt_transform[index, ]
rt_test <- rt_transform[-index, ]
str(rt_train)           

y_train <- train_m$box_office
y_test <-rt_test$box_office


train_m$box_office <- NULL
rt_test$box_office <- NULL

#selected feature attributes
boruta.train <- Boruta(interval~., train_m, doTrace =1)

#graph to see most important var to interval
lz<-lapply(1:ncol(boruta.train$ImpHistory),function(i)

boruta.train$ImpHistory[is.finite(boruta.train$ImpHistory[,i]),i])
names(lz) <- colnames(boruta.train$ImpHistory)
plot(boruta.train, xlab = "", xaxt = "n")
Labels <- sort(sapply(lz,median))
axis(side = 1,las=2,labels = names(Labels),
       at = 1:ncol(boruta.train$ImpHistory), cex.axis = 0.7)


#get most important attributes
final.boruta <- TentativeRoughFix(boruta.train)
print(final.boruta)

getSelectedAttributes(final.boruta, withTentative = F)
boruta.rt_df <- attStats(final.boruta)
boruta.rt_df
boruta.rt_df <- setDT(boruta.rt_df, keep.rownames = TRUE)[]

predictors <- boruta.rt_df %>%
  filter(., decision =="Confirmed") %>%
  select(., rn)
predictors <- unlist(predictors)

control <- trainControl(method="repeatedcv", 
                        number=10, 
                        repeats=6)

#look at residuals
#p-value is very small so reject H0 that predictors have no effect so 
#we can use rotten tomatoes to predict box_office ranges
train_m$interval <- NULL
model_lm <- train(train_m[,predictors],
                  y_train, method='lm',
                  trControl = control, tuneLength = 10)
model_lm #.568
# 
plot(model_lm)
plot(model_lm)
z <- varImp(object=model_lm)
z <- setDT(z, keep.rownames =  TRUE)
z$model <- NULL
z$calledFrom <- NULL
row.names(z)
plot(varImp(object=model_lm),main="Linear Model Variable Importance")

predictions<-predict.train(object=model_lm,rt_test[,predictors],type="raw")
table(predictions)

#get coeff
interc <- coef(model_lm$finalModel)
slope <- coef(model_lm$finalModel)
ggplot(data = rt_train, aes(y = box_office)) +
  geom_point() +
  geom_abline(slope = slope, intercept = interc, color = 'red')

这是我的一些输入looks like.谢谢!!

【问题讨论】:

  • 您应该提供minimal reproducible exampleboruta 特征选择在这里并不重要,它只会使示例变得混乱。没有人想从图像中复制数据,请使用dput 提供数据样本,或者更好地使用内置数据集来说明问题。你能说一下你在lm 中调整了什么还是只是为了估计模型的准确性?
  • +1 需要更清晰和可重复的示例。顺便说一句,居中和缩放不会“解决”多重共线性。充其量,当您的模型具有交互作用时,它可以帮助解决这个问题,如果预测变量值远离 0,则居中可能会有所帮助。

标签: r linear-regression r-caret


【解决方案1】:

这是一个使用内置数据集汽车的示例:

data(cars, package = "datasets")
library(caret)

建立模型

control <- trainControl(method = "repeatedcv", 
                        number = 10, 
                        repeats = 6)

model_lm <- train(dist ~ speed, data = cars, method='lm',
                  trControl = control, tuneLength = 10)

我假设您想要绘制最终模型。

您可以使用caret predict.train 函数从模型中获取预测并绘制它们:

pred <- predict(model_lm, cars)
pred <- data.frame(pred = pred, speed = cars$speed)

此外,您可以将汽车数据集提供给几何点并绘制观察结果:

library(ggplot2)

ggplot(data = pred)+
  geom_line(aes(x = speed, y = pred))+
  geom_point(data = cars, aes(x=speed, y = dist))

如果您想获得置信区间或预测区间,您可以使用 model_lm$finalModel 上的 predict.lm 函数:

以下是预测区间的示例:

pred <- predict(model_lm$finalModel, cars, se.fit = TRUE, interval = "prediction")
pred <- data.frame(pred = pred$fit[,1], speed = cars$speed, lwr = pred$fit[,2], upr = pred$fit[,3])

pred_int <- ggplot(data = pred)+
  geom_line(aes(x = speed, y = pred))+
  geom_point(data = cars, aes(x = speed, y = dist)) +
  geom_ribbon(aes(ymin = lwr, ymax = upr, x = speed), alpha = 0.2)

或置信区间:

pred <- predict(model_lm$finalModel, cars, se.fit = TRUE, interval = "confidence")
pred <- data.frame(pred = pred$fit[,1], speed = cars$speed, lwr = pred$fit[,2], upr = pred$fit[,3])

pred_conf <- ggplot(data = pred)+
  geom_line(aes(x = speed, y = pred))+
  geom_point(data = cars, aes(x = speed, y = dist)) +
  geom_ribbon(aes(ymin = lwr, ymax = upr, x = speed), alpha = 0.2)

并排绘制它们:

library(cowplot)
plot_grid(pred_int, pred_conf)

要绘制对两个变量的线性依赖关系,您可以使用 3D 图,超过 3 个将是一个问题。

【讨论】:

  • 可能是不错的回复,但据我所知,距离和速度不在汽车数据集中。我不明白这里caret:train 的所有大惊小怪(尽管这可能与最初的问题有关)。使用线性模型train 不会调整任何内容。 finalModel 始终只是初始完整模型。唯一需要调整的是解释变量的数量,即更多的变量/模型选择。 train 对线性模型的唯一兴趣是通过 model_lm$resample 中的交叉验证获得对预测性能的公平估计。还是我哪里错了?
  • @Gilles 此处使用的 cars 来自基础 R 中包含的数据集:cars {datasets}。我更新了这个问题以明确这一点。实际上,这里根本不需要插入符号(至少用于绘图),以提供更多关于我必须使用的情节的见解predict.lm。所以你是完全正确的。我添加了答案,因为这是一个新用户的问题,他显然试图提出一个好问题,但他的经验不足限制了他的努力范围。我什至不确定它会有多大用处,因为有问题的数据集有模型可能使用的多个功能。
  • 感谢您的澄清!也许data(cars, package = "datasets") 会更安全,因为用户很容易已经加载了caret,然后将加载来自caretcars
猜你喜欢
  • 2019-02-23
  • 1970-01-01
  • 1970-01-01
  • 2014-02-20
  • 2021-03-15
  • 2018-07-06
  • 2019-10-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多