使用 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 创建
我想使用 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 创建