Сформируйте свой собственный датасет с помощью функции c (конкатенация), в котором содержатся числовые данные и NA значения.
dataset <-c(1.124,19.27, 13.54, NA, 39.1, 20.0, NA, 65.9, 38.12)
dataset
## [1] 1.124 19.270 13.540 NA 39.100 20.000 NA 65.900 38.120
Проведите очистку данных с использованием функции is.na() [1]. И выведите “чистый” датасет.
clean_dataset <- dataset[!is.na(dataset)]
clean_dataset
## [1] 1.124 19.270 13.540 39.100 20.000 65.900 38.120
Сгенерируйте таблицу данных с числовыми и текстовые столбцами (аналогично с помощью функции c). Очистите данные с помощью функции complete.cases() [1].
strings <- c("a", NA, "c", "d", NA, "f")
numbers <- c(1, NA, 3, NA, 5, 6)
good <- complete.cases(strings, numbers)
good
## [1] TRUE FALSE TRUE FALSE FALSE TRUE
strings[good]
## [1] "a" "c" "f"
numbers[good]
## [1] 1 3 6
Проанализируйте датасет airquality с пропусками из пакета caret. С использованием функции preProcess из пакета caret заполните пропуски предсказанными значениями (среднее, медиана) [2].
Исходные данные:
data(airquality)
summary(airquality)
## Ozone Solar.R Wind Temp
## Min. : 1.00 Min. : 7.0 Min. : 1.700 Min. :56.00
## 1st Qu.: 18.00 1st Qu.:115.8 1st Qu.: 7.400 1st Qu.:72.00
## Median : 31.50 Median :205.0 Median : 9.700 Median :79.00
## Mean : 42.13 Mean :185.9 Mean : 9.958 Mean :77.88
## 3rd Qu.: 63.25 3rd Qu.:258.8 3rd Qu.:11.500 3rd Qu.:85.00
## Max. :168.00 Max. :334.0 Max. :20.700 Max. :97.00
## NA's :37 NA's :7
## Month Day
## Min. :5.000 Min. : 1.0
## 1st Qu.:6.000 1st Qu.: 8.0
## Median :7.000 Median :16.0
## Mean :6.993 Mean :15.8
## 3rd Qu.:8.000 3rd Qu.:23.0
## Max. :9.000 Max. :31.0
##
Медиана:
preprocessed_airquality <- preProcess(airquality, method="medianImpute")
predicted_airquality <- predict(preprocessed_airquality, airquality)
summary(predicted_airquality)
## Ozone Solar.R Wind Temp
## Min. : 1.00 Min. : 7.0 Min. : 1.700 Min. :56.00
## 1st Qu.: 21.00 1st Qu.:120.0 1st Qu.: 7.400 1st Qu.:72.00
## Median : 31.50 Median :205.0 Median : 9.700 Median :79.00
## Mean : 39.56 Mean :186.8 Mean : 9.958 Mean :77.88
## 3rd Qu.: 46.00 3rd Qu.:256.0 3rd Qu.:11.500 3rd Qu.:85.00
## Max. :168.00 Max. :334.0 Max. :20.700 Max. :97.00
## Month Day
## Min. :5.000 Min. : 1.0
## 1st Qu.:6.000 1st Qu.: 8.0
## Median :7.000 Median :16.0
## Mean :6.993 Mean :15.8
## 3rd Qu.:8.000 3rd Qu.:23.0
## Max. :9.000 Max. :31.0
Сгенерируйте два числовых набора данных и добавьте в них выбросы. С использованием функции boxplot обнаружьте выбросы и удалить их [3, 4].
x <- c(rnorm(100, mean=5), 12) # Добавляем дополнительные выбросы
y <- c(3, rnorm(100, mean=10))
plot(x,y)
boxplot(x)
boxplot(y)
ind <- c(which(x %in% boxplot.stats(x)$out), which(y %in% boxplot.stats(y)$out))
x <- x[-ind]
y <- y[-ind]
plot(x,y)
Сгенерируйте таблицу данных, в которой дублируются строки. Удалите строки с использованием функций unique(), duplicated(). Сравните результаты [5].
a <- c(rep("A", 3), rep("B", 3), rep("C",2))
b <- c(1,1,2,4,1,1,2,2)
df <-data.frame(a,b)
df
## a b
## 1 A 1
## 2 A 1
## 3 A 2
## 4 B 4
## 5 B 1
## 6 B 1
## 7 C 2
## 8 C 2
unique(df)
## a b
## 1 A 1
## 3 A 2
## 4 B 4
## 5 B 1
## 7 C 2
df[!duplicated(df), ]
## a b
## 1 A 1
## 3 A 2
## 4 B 4
## 5 B 1
## 7 C 2
identical(unique(df), df[!duplicated(df), ])
## [1] TRUE
Результаты идентичны.
Обработайте пропуски в данных с использованием пакета mice [6].
Создаём данные:
dataset <- data.frame(var1=rnorm(20,5,1), var2=rnorm(20,10,1))
dataset[c(2,5,7,10),1] <- NA
dataset[c(4,8,19),2] <- NA
summary(dataset)
## var1 var2
## Min. :3.140 Min. : 7.265
## 1st Qu.:4.324 1st Qu.: 9.648
## Median :5.483 Median : 9.954
## Mean :5.136 Mean : 9.924
## 3rd Qu.:6.011 3rd Qu.:10.436
## Max. :6.578 Max. :11.861
## NA's :4 NA's :3
Заполняем данные при помощи MICE:
dataset <- mice(dataset)
##
## iter imp variable
## 1 1 var1 var2
## 1 2 var1 var2
## 1 3 var1 var2
## 1 4 var1 var2
## 1 5 var1 var2
## 2 1 var1 var2
## 2 2 var1 var2
## 2 3 var1 var2
## 2 4 var1 var2
## 2 5 var1 var2
## 3 1 var1 var2
## 3 2 var1 var2
## 3 3 var1 var2
## 3 4 var1 var2
## 3 5 var1 var2
## 4 1 var1 var2
## 4 2 var1 var2
## 4 3 var1 var2
## 4 4 var1 var2
## 4 5 var1 var2
## 5 1 var1 var2
## 5 2 var1 var2
## 5 3 var1 var2
## 5 4 var1 var2
## 5 5 var1 var2
dataset <- complete(dataset)
summary(dataset)
## var1 var2
## Min. :3.140 Min. : 7.265
## 1st Qu.:4.010 1st Qu.: 9.385
## Median :4.784 Median : 9.864
## Mean :4.924 Mean : 9.670
## 3rd Qu.:5.848 3rd Qu.:10.393
## Max. :6.578 Max. :11.861
Разберите пример с мультиколлинеарностью [7].
Получаем данные:
wagesmicrodata <- read_excel("wagesmicrodata.xlsx", sheet = "Data", skip = 0)
head(wagesmicrodata)
## # A tibble: 6 × 11
## EDUCATION SOUTH SEX EXPERIENCE UNION WAGE AGE RACE OCCUPATION SECTOR
## <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 8 0 1 21 0 5.1 35 2 6 1
## 2 9 0 1 42 0 4.95 57 3 6 1
## 3 12 0 0 1 0 6.67 19 3 6 1
## 4 12 0 0 4 0 4 22 3 6 0
## 5 12 0 0 17 0 7.5 35 3 6 0
## 6 13 0 0 9 1 13.1 28 3 6 0
## # ℹ 1 more variable: MARR <dbl>
Построим линейную модель и посмотрим на результат:
fit1<- lm(log(WAGE)~OCCUPATION+SECTOR+UNION+EDUCATION+EXPERIENCE+AGE+SEX+MARR+RACE+SOUTH, data=wagesmicrodata)
summary(fit1)
##
## Call:
## lm(formula = log(WAGE) ~ OCCUPATION + SECTOR + UNION + EDUCATION +
## EXPERIENCE + AGE + SEX + MARR + RACE + SOUTH, data = wagesmicrodata)
##
## Residuals:
## Min 1Q Median 3Q Max
## -2.16246 -0.29163 -0.00469 0.29981 1.98248
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 1.078596 0.687514 1.569 0.117291
## OCCUPATION -0.007417 0.013109 -0.566 0.571761
## SECTOR 0.091458 0.038736 2.361 0.018589 *
## UNION 0.200483 0.052475 3.821 0.000149 ***
## EDUCATION 0.179366 0.110756 1.619 0.105949
## EXPERIENCE 0.095822 0.110799 0.865 0.387531
## AGE -0.085444 0.110730 -0.772 0.440671
## SEX -0.221997 0.039907 -5.563 4.24e-08 ***
## MARR 0.076611 0.041931 1.827 0.068259 .
## RACE 0.050406 0.028531 1.767 0.077865 .
## SOUTH -0.102360 0.042823 -2.390 0.017187 *
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 0.4398 on 523 degrees of freedom
## Multiple R-squared: 0.3185, Adjusted R-squared: 0.3054
## F-statistic: 24.44 on 10 and 523 DF, p-value: < 2.2e-16
Несмотря на приличный R, половина предикторов «провалилась» по t‑тесту — тревожный признак. Построим парные графики для нахождения корреляций.
pairs(wagesmicrodata)
Видна корреляция в паре AGE — EXPERIENCE.
omcdiag(fit1)
##
## Call:
## omcdiag(mod = fit1)
##
##
## Overall Multicollinearity Diagnostics
##
## MC Results detection
## Determinant |X'X|: 0.0001 1
## Farrar Chi-Square: 4818.3895 1
## Red Indicator: 0.1983 0
## Sum of Lambda Inverse: 10068.8439 1
## Theil's Method: 0.8845 1
## Condition Number: 739.7337 1
##
## 1 --> COLLINEARITY is detected by the test
## 0 --> COLLINEARITY is not detected by the test
imcdiag(fit1)
##
## Call:
## imcdiag(mod = fit1)
##
##
## All Individual Multicollinearity Diagnostics Result
##
## VIF TOL Wi Fi Leamer CVIF Klein
## OCCUPATION 1.2982 0.7703 17.3637 19.5715 0.8777 1.3620 0
## SECTOR 1.1987 0.8343 11.5670 13.0378 0.9134 1.2576 0
## UNION 1.1209 0.8922 7.0368 7.9315 0.9445 1.1759 0
## EDUCATION 231.1956 0.0043 13402.4982 15106.5849 0.0658 242.5527 1
## EXPERIENCE 5184.0939 0.0002 301771.2445 340140.5368 0.0139 5438.7545 1
## AGE 4645.6650 0.0002 270422.7164 304806.1391 0.0147 4873.8761 1
## SEX 1.0916 0.9161 5.3351 6.0135 0.9571 1.1453 0
## MARR 1.0961 0.9123 5.5969 6.3085 0.9551 1.1500 0
## RACE 1.0371 0.9642 2.1622 2.4372 0.9819 1.0881 0
## SOUTH 1.0468 0.9553 2.7264 3.0731 0.9774 1.0983 0
## IND1 IND2
## OCCUPATION 0.0132 0.6125
## SECTOR 0.0143 0.4419
## UNION 0.0153 0.2875
## EDUCATION 0.0001 2.6546
## EXPERIENCE 0.0000 2.6656
## AGE 0.0000 2.6656
## SEX 0.0157 0.2238
## MARR 0.0157 0.2338
## RACE 0.0166 0.0955
## SOUTH 0.0164 0.1193
##
## 1 --> COLLINEARITY is detected by the test
## 0 --> COLLINEARITY is not detected by the test
##
## OCCUPATION , EDUCATION , EXPERIENCE , AGE , MARR , RACE , coefficient(s) are non-significant may be due to multicollinearity
##
## R-square of y on all x: 0.3185
##
## * use method argument to check which regressors may be the reason of collinearity
## ===================================
Колоссальные VIF‑ы указывает именно на эти две переменные.
Оставляем одну:
fit2<- lm(log(WAGE)~OCCUPATION+SECTOR+UNION+EDUCATION+AGE+SEX+MARR+RACE+SOUTH, data=wagesmicrodata)
summary(fit2)
##
## Call:
## lm(formula = log(WAGE) ~ OCCUPATION + SECTOR + UNION + EDUCATION +
## AGE + SEX + MARR + RACE + SOUTH, data = wagesmicrodata)
##
## Residuals:
## Min 1Q Median 3Q Max
## -2.16018 -0.29085 -0.00513 0.29985 1.97932
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 0.501358 0.164794 3.042 0.002465 **
## OCCUPATION -0.006941 0.013095 -0.530 0.596309
## SECTOR 0.091013 0.038723 2.350 0.019125 *
## UNION 0.200018 0.052459 3.813 0.000154 ***
## EDUCATION 0.083815 0.007728 10.846 < 2e-16 ***
## AGE 0.010305 0.001745 5.905 6.34e-09 ***
## SEX -0.220100 0.039837 -5.525 5.20e-08 ***
## MARR 0.075125 0.041886 1.794 0.073458 .
## RACE 0.050674 0.028523 1.777 0.076210 .
## SOUTH -0.103186 0.042802 -2.411 0.016261 *
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 0.4397 on 524 degrees of freedom
## Multiple R-squared: 0.3175, Adjusted R-squared: 0.3058
## F-statistic: 27.09 on 9 and 524 DF, p-value: < 2.2e-16
Теперь видно, что из 9 коэффициентов регрессии, 8 статистически значимы.