使用 R 进行回归和预测

Regression and Prediction using R

我想使用 R 中 openintro 包中的快餐数据集执行以下任务。

a) 创建一个回归预测餐厅是麦当劳还是赛百味 基于卡路里、钠和蛋白质。 (麦当劳应该是1,地铁应该是0)

将系数保存到 Q2。

b) 仅使用餐厅中商品数量在 50 到 60 之间的餐厅的数据 数据集。根据胆固醇、总碳水化合物、维生素 A 和餐厅预测总脂肪。 删除任何不重要的预测变量并再次 运行。

将最强的标准化回归系数分配给 Q5。

这是我的代码。

library(tidyverse)    
library(openintro)    
library(lm.beta)

fastfood <- openintro::fastfood    
head(fastfood)

#Solving for part (a)    
fit_1 <- lm(I(restaurant %in% c("Subway", "Mcdonalds")) ~ calories + sodium + protein, data = fastfood)

Q2 <- round(summary(fit_1)$coefficients,2)

#Solving for part (b)    
newdata <- fastfood[ which(fastfood$item>=50 & fastfood$item <= 60), ]    
df = sort(sample(nrow(newdata), nrow(data)*.7))    
newdata_train<-data[df,]    
newdata_test<-data[-df,]    
fit_5 <- lm(I(total_fat) ~ cholesterol + total_carb + vit_a + restaurant, data = newdata)    
prediction_5 <- predict(fit_5, newdata = newdata_test)

Q5 <- lm.beta(fit_5)

但我没有得到想要的结果

这是所需的输出

部分 (a) 的输出:

部分 (b) 的输出:

第一个问题需要逻辑回归而不是线性回归,因为目的是预测二元结果。最明智的做法是,正如问题所暗示的那样,删除除麦当劳和赛百味之外的所有餐厅,然后创建一个新的二进制变量来标记哪些行是麦当劳,哪些不是:

library(dplyr) 

fastfood <- openintro::fastfood %>% 
  filter(restaurant %in% c("Mcdonalds", "Subway")) %>%
  mutate(is_mcdonalds = restaurant == "Mcdonalds")

逻辑回归是这样做的:

fit_1 <- glm(is_mcdonalds ~ calories + sodium + protein, 
             family = "binomial", data = fastfood)

你的系数是这样获得的:

Q2 <- round(coef(fit_1), 2)

Q2
#> (Intercept)    calories      sodium     protein 
#>       -1.24        0.00        0.00        0.06

第二个问题要求您过滤掉所有超过 60 项或少于 50 项的餐厅:

fastfood <- openintro::fastfood %>%
  group_by(restaurant) %>%
  filter(n() >= 50 & n() <= 60)

我们现在拟合描述的回归并检查它以寻找 non-significant 回归变量:

fit_2 <- lm(total_fat ~ cholesterol + vit_a + total_carb + restaurant,
            data = fastfood)

summary(fit_2)
#> 
#> Call:
#> lm(formula = total_fat ~ cholesterol + vit_a + total_carb + restaurant, 
#>     data = fastfood)
#> 
#> Residuals:
#>      Min       1Q   Median       3Q      Max 
#> -24.8280  -2.9417   0.9397   5.1450  21.0494 
#> 
#> Coefficients:
#>                     Estimate Std. Error t value Pr(>|t|)    
#> (Intercept)         -1.20102    2.08029  -0.577 0.564751    
#> cholesterol          0.26932    0.01129  23.853  < 2e-16 ***
#> vit_a                0.01159    0.01655   0.701 0.484895    
#> total_carb           0.16327    0.03317   4.922 2.64e-06 ***
#> restaurantMcdonalds -4.90272    1.94071  -2.526 0.012778 *  
#> restaurantSonic      6.43353    1.89014   3.404 0.000894 ***
#> ---
#> Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
#> 
#> Residual standard error: 7.611 on 125 degrees of freedom
#>   (34 observations deleted due to missingness)
#> Multiple R-squared:  0.8776, Adjusted R-squared:  0.8727 
#> F-statistic: 179.2 on 5 and 125 DF,  p-value: < 2.2e-16

我们注意到 vit_a 是 non-significant 并将其从我们的模型中删除:

fit_3 <- update(fit_2, . ~ . - vit_a)

现在我们得到正则化系数并对它们进行四舍五入:

coefs <- round(coef(lm.beta::lm.beta(fit_3)), 2)

Q5 将是这些系数的最大值:

Q5 <- coefs[which.max(coefs)]

Q5
#> cholesterol 
#>        0.82

reprex package (v2.0.1)

于 2022-02-26 创建