{
  "cells": [
    {
      "cell_type": "markdown",
      "metadata": {
        "_cell_guid": "1c8937ad-fc8b-eb7d-9777-574b96f9137d"
      },
      "source": [
        "# Random Effects for Manager Skill\n",
        "\n",
        "Instead of predicting p(low, medium, high | manager_id) as a means to encode the manager_id I decided to fit low vs not-low as a beta-binomial. \n",
        "\n",
        "here is the code I used to generate manager skill using lme4"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "_cell_guid": "1d41bf89-de6c-d8a2-1dc2-b36a50221a26"
      },
      "outputs": [],
      "source": [
        "library(lme4)\n",
        "library(tidyverse)\n",
        "library(jsonlite)"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "_cell_guid": "2d953771-8200-2bdc-3852-31a48035f028"
      },
      "outputs": [],
      "source": [
        "t1 <- fromJSON(\"../input/train.json\")\n",
        "df = tibble(manager_id= unlist(t1$manager_id), \n",
        "       low=as.integer(t1$interest_level=='low'),\n",
        "       high=as.integer(t1$interest_level!='low'))"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "_cell_guid": "fab35004-d972-e2e6-f634-4a553c22eda7"
      },
      "outputs": [],
      "source": [
        "df %>% \n",
        "    group_by(manager_id) %>%\n",
        "    summarize(success = sum(high), failure = sum(low)) -> grouped_df\n",
        "head(grouped_df)"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "_cell_guid": "dc7f94cb-16da-3e0a-4427-049bc79fa052"
      },
      "outputs": [],
      "source": [
        "fit = glmer(cbind(success, failure) ~ (1 | manager_id), data=grouped_df, family='binomial')\n",
        "grouped_df[\"manager_skill\"] = predict(fit, type=\"response\")"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "_cell_guid": "0994d5b7-6af2-7762-e853-b08346a6f8af"
      },
      "outputs": [],
      "source": [
        "head(grouped_df)"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "_cell_guid": "86e07bed-6b38-fbf5-d172-e7a591d32bbd"
      },
      "source": [
        "Notice that the managers with only one faile or success dont get assigned skills of 1 or 0"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "_cell_guid": "f6889fd8-60af-00fc-b464-e98876ee7f44"
      },
      "outputs": [],
      "source": [
        "base_skill = mean(grouped_df$manager_skill)"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "_cell_guid": "f2ef1616-6e3c-79a3-a5ca-d4b6ca6e9b5d"
      },
      "source": [
        "# Joining Data to produce listing_id -> manager_skill"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "_cell_guid": "7460c5af-c866-986d-edf6-f7763aa9255e"
      },
      "outputs": [],
      "source": [
        "t1 <- fromJSON(\"../input/train.json\")\n",
        "t1 = tibble(manager_id= unlist(t1$manager_id),\n",
        "            listing_id= unlist(t1$listing_id))\n",
        "\n",
        "s1 <- fromJSON(\"../input/test.json\")\n",
        "s1 = tibble(manager_id= unlist(s1$manager_id),\n",
        "            listing_id= unlist(s1$listing_id))"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "_cell_guid": "b64cb20a-7b6a-392a-465f-02bf1fe97224"
      },
      "outputs": [],
      "source": [
        "ts1 = rbind(t1, s1)\n",
        "gc()"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "_cell_guid": "533d1b9d-7b36-b8a5-24e5-ce585334a052"
      },
      "outputs": [],
      "source": [
        "ts1 = ts1 %>% left_join(select(grouped_df, manager_id, manager_skill))\n",
        "ts1$manager_skill[is.na(ts1$manager_skill)] = base_skill"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "_cell_guid": "41a48bf2-82ab-4fc4-2115-a620ba366e4e"
      },
      "outputs": [],
      "source": [
        "ts1 %>% \n",
        "    select(listing_id, manager_skill) %>% \n",
        "    write_csv(\"./re_manager_skill.csv\")"
      ]
    }
  ],
  "metadata": {
    "_change_revision": 0,
    "_is_fork": false,
    "kernelspec": {
      "display_name": "R",
      "language": "R",
      "name": "ir"
    },
    "language_info": {
      "codemirror_mode": "r",
      "file_extension": ".r",
      "mimetype": "text/x-r-source",
      "name": "R",
      "pygments_lexer": "r",
      "version": "3.3.3"
    }
  },
  "nbformat": 4,
  "nbformat_minor": 0
}