Skip to content

Commit

Permalink
Дополнен список задач по R
Browse files Browse the repository at this point in the history
  • Loading branch information
matyushkin committed Nov 22, 2020
1 parent 2e575f8 commit 7f5b8a6
Showing 1 changed file with 238 additions and 2 deletions.
240 changes: 238 additions & 2 deletions R/puzzles.ipynb
Original file line number Diff line number Diff line change
Expand Up @@ -1550,12 +1550,248 @@
"head(regr.calc(iris[,c(1,4)]), 10)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Памятка\n",
"\n",
"```\n",
"cor.test(mtcars$mpg, mtcars$disp) # Расчет корреляции Пирсона \n",
"\n",
"cor.test(~ mpg + disp, mtcars) # запись через формулу\n",
"\n",
"cor.test(mtcars$mpg, mtcars$disp, method = \"spearman\") # Расчет корреляции Спирмена \n",
"\n",
"cor.test(mtcars$mpg, mtcars$disp, method = \"kendall\") # Расчет корреляции Кендала \n",
"\n",
"cor(iris[, -5]) # построение корреляционной матрицы\n",
"\n",
"fit <- lm(mpg ~ disp, mtcars) # построение линейной регрессии \n",
"\n",
"fit$coefficients # коэффициенты регрессии \n",
"\n",
"fit$fitted.values # предсказанные значения зависимой переменной \n",
"```\n",
"\n",
"При наличии одинаковых значений в переменных расчет непараметрических корреляций будет сопровождаться предупреждением о невозможности рассчитать точное значение p - value.\n",
"\n",
"Если в ваших данных есть одинаковые наблюдения, но вы хотите рассчитать непараметрическую корреляцию, используйте функцию spearman_test из пакета coin\n",
"\n",
"```R\n",
"library(coin)\n",
"spearman_test(~ mpg + disp, mtcars)\n",
"```\n",
"\n",
"Обратите внимание на различия в графиках. То что в первом aes() будет распространяться на все слои. А то, что в aes() конкретного geom - только на него.\n",
"\n",
"```R\n",
"ggplot(mtcars, aes(mpg, disp, col = factor(am)))+\n",
" geom_point()+\n",
" geom_smooth()\n",
"\n",
"ggplot(mtcars, aes(mpg, disp))+\n",
" geom_point(aes(col = factor(am)))+\n",
" geom_smooth()\n",
"\n",
"ggplot(mtcars, aes(mpg, disp))+\n",
" geom_point()+\n",
" geom_smooth(aes(col = factor(am)))\n",
"```"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Множественная линейная регрессия\n",
"\n",
"**Задача**. Напишите функцию `fill_na`, которая принимает на вход данные с тремя переменными:\n",
"- $x_1$ — числовой вектор\n",
"- $x_2$ — числовой вектор\n",
"- $y$ — числовой вектор с пропущенными значениями.\n",
"\n",
"На первом этапе, используя только наблюдения, в которых нет пропущенных значений, постройте регрессионную модель (без взаимодействий), где $y$ — зависимая переменная, $x_1$ и $x_2$ — независимые переменные.\n",
"\n",
"Затем, используя построенную модель, заполните пропущенные значения предсказаниями модели.\n",
"\n",
"Функция должна возвращать dataframe c новой переменной `y_full`. Сохраните в нее переменную `y`, в которой пропущенные значения заполнены предсказанными значениями построенной модели."
]
},
{
"cell_type": "code",
"execution_count": 19,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<table>\n",
"<caption>A data.frame: 10 × 4</caption>\n",
"<thead>\n",
"\t<tr><th scope=col>x_1</th><th scope=col>x_2</th><th scope=col>y</th><th scope=col>y_full</th></tr>\n",
"\t<tr><th scope=col>&lt;int&gt;</th><th scope=col>&lt;int&gt;</th><th scope=col>&lt;int&gt;</th><th scope=col>&lt;dbl&gt;</th></tr>\n",
"</thead>\n",
"<tbody>\n",
"\t<tr><td> 9</td><td>22</td><td>14</td><td>14.00000</td></tr>\n",
"\t<tr><td>14</td><td>35</td><td> 9</td><td> 9.00000</td></tr>\n",
"\t<tr><td>10</td><td>45</td><td>NA</td><td>13.12727</td></tr>\n",
"\t<tr><td> 6</td><td>35</td><td>NA</td><td>13.30132</td></tr>\n",
"\t<tr><td>11</td><td>36</td><td>16</td><td>16.00000</td></tr>\n",
"\t<tr><td> 5</td><td>27</td><td>11</td><td>11.00000</td></tr>\n",
"\t<tr><td> 9</td><td>34</td><td>NA</td><td>12.83632</td></tr>\n",
"\t<tr><td> 6</td><td>25</td><td>NA</td><td>12.90783</td></tr>\n",
"\t<tr><td>11</td><td>38</td><td>13</td><td>13.00000</td></tr>\n",
"\t<tr><td>12</td><td>23</td><td>NA</td><td>11.97784</td></tr>\n",
"</tbody>\n",
"</table>\n"
],
"text/latex": [
"A data.frame: 10 × 4\n",
"\\begin{tabular}{llll}\n",
" x\\_1 & x\\_2 & y & y\\_full\\\\\n",
" <int> & <int> & <int> & <dbl>\\\\\n",
"\\hline\n",
"\t 9 & 22 & 14 & 14.00000\\\\\n",
"\t 14 & 35 & 9 & 9.00000\\\\\n",
"\t 10 & 45 & NA & 13.12727\\\\\n",
"\t 6 & 35 & NA & 13.30132\\\\\n",
"\t 11 & 36 & 16 & 16.00000\\\\\n",
"\t 5 & 27 & 11 & 11.00000\\\\\n",
"\t 9 & 34 & NA & 12.83632\\\\\n",
"\t 6 & 25 & NA & 12.90783\\\\\n",
"\t 11 & 38 & 13 & 13.00000\\\\\n",
"\t 12 & 23 & NA & 11.97784\\\\\n",
"\\end{tabular}\n"
],
"text/markdown": [
"\n",
"A data.frame: 10 × 4\n",
"\n",
"| x_1 &lt;int&gt; | x_2 &lt;int&gt; | y &lt;int&gt; | y_full &lt;dbl&gt; |\n",
"|---|---|---|---|\n",
"| 9 | 22 | 14 | 14.00000 |\n",
"| 14 | 35 | 9 | 9.00000 |\n",
"| 10 | 45 | NA | 13.12727 |\n",
"| 6 | 35 | NA | 13.30132 |\n",
"| 11 | 36 | 16 | 16.00000 |\n",
"| 5 | 27 | 11 | 11.00000 |\n",
"| 9 | 34 | NA | 12.83632 |\n",
"| 6 | 25 | NA | 12.90783 |\n",
"| 11 | 38 | 13 | 13.00000 |\n",
"| 12 | 23 | NA | 11.97784 |\n",
"\n"
],
"text/plain": [
" x_1 x_2 y y_full \n",
"1 9 22 14 14.00000\n",
"2 14 35 9 9.00000\n",
"3 10 45 NA 13.12727\n",
"4 6 35 NA 13.30132\n",
"5 11 36 16 16.00000\n",
"6 5 27 11 11.00000\n",
"7 9 34 NA 12.83632\n",
"8 6 25 NA 12.90783\n",
"9 11 38 13 13.00000\n",
"10 12 23 NA 11.97784"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"test_data <- read.csv(\"https://stepic.org/media/attachments/course/129/fill_na_test.csv\")\n",
"\n",
"fill_na <- function(test_data){\n",
" # находим линейную регрессию \n",
" r <- lm(y ~ x_1 + x_2, test_data)\n",
" \n",
" # копируем переменную\n",
" y_full <- test_data$y\n",
" \n",
" # находим позиции пропущенных значений\n",
" empty <- which(is.na(y_full))\n",
" \n",
" # и подставляем значения, соответствующие регрессии\n",
" y_full[empty] <- predict(r, test_data)[empty]\n",
" \n",
" # добавляем переменную в датасет и возвращаем\n",
" test_data$y_full <- y_full\n",
" return(test_data)\n",
"}\n",
"\n",
"fill_na(test_data)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"**Задача**. В переменной `df` сохранен subset данных `mtcars` только с переменными \"wt\", \"mpg\", \"disp\", \"drat\", \"hp\". Воспользуйтесь множественным регрессионным анализом, чтобы предсказать вес машины (переменная \"wt\"). Выберите такую комбинацию независимых переменных (из \"mpg\", \"disp\", \"drat\", \"hp\"), чтобы значение `R^2 adjusted` было наибольшим. Взаимодействия факторов учитывать не надо. "
]
},
{
"cell_type": "code",
"execution_count": null,
"execution_count": 27,
"metadata": {},
"outputs": [],
"source": []
"source": [
"df <- mtcars[c(\"wt\", \"mpg\", \"disp\", \"drat\", \"hp\")]"
]
},
{
"cell_type": "code",
"execution_count": 41,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Start: AIC=-56.88\n",
"wt ~ mpg + disp + hp\n",
"\n",
" Df Sum of Sq RSS AIC\n",
"<none> 4.2136 -56.877\n",
"- hp 1 0.6684 4.8820 -54.166\n",
"- mpg 1 1.9125 6.1261 -46.902\n",
"- disp 1 3.1058 7.3195 -41.206\n"
]
}
],
"source": [
"ideal_model <- step(lm(wt ~ mpg + disp + hp, data = df),\n",
" direction = 'backward')"
]
},
{
"cell_type": "code",
"execution_count": 39,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"0.842813587320083"
],
"text/latex": [
"0.842813587320083"
],
"text/markdown": [
"0.842813587320083"
],
"text/plain": [
"[1] 0.8428136"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"summary(lm(wt ~ mpg + disp + hp, data = df))$adj.r.squared"
]
}
],
"metadata": {
Expand Down

0 comments on commit 7f5b8a6

Please sign in to comment.