Задание 1

Сформируйте свой собственный датасет с помощью функции 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

Задание 2

Проведите очистку данных с использованием функции 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

Задание 3

Сгенерируйте таблицу данных с числовыми и текстовые столбцами (аналогично с помощью функции 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

Задание 4

Проанализируйте датасет 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

Задание 5

Сгенерируйте два числовых набора данных и добавьте в них выбросы. С использованием функции 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)

Задание 6

Сгенерируйте таблицу данных, в которой дублируются строки. Удалите строки с использованием функций 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

Результаты идентичны.

Задание 7

Обработайте пропуски в данных с использованием пакета 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

Задание 8

Разберите пример с мультиколлинеарностью [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 статистически значимы.