{"action":"created","comment":{"url":"https://api.github.com/repos/biocore/scikit-bio/pulls/comments/42803793","id":42803793,"diff_hunk":"@@ -608,10 +611,272 @@ def centralize(mat):\n \n     \"\"\"\n     mat = closure(mat)\n-    cen = ss.gmean(mat, axis=0)\n+    cen = scipy.stats.gmean(mat, axis=0)\n     return perturb_inv(mat, cen)\n \n \n+@experimental(as_of=\"0.4.0-dev\")\n+def ancom(table, categories,\n+          alpha=0.05,\n+          tau=0.02,\n+          theta=0.1,\n+          multiple_comparisons_correction=None,\n+          significance_test=scipy.stats.ttest_ind):\n+    r\"\"\" Performs differential abundance test using ANCOM\n+\n+    This is done by calculating pairwise log ratios between all otus\n+    and performing a signficance test to determine if there is a\n+    significant difference in feature ratios with respect to the\n+    variable of interest\n+\n+    In an experiment with only two treatments, this test tests the\n+    following hypothesis for feature :math:`i`\n+    :math:`H_{0i}:\\mathbb{E}[\\ln(u_i^{(1)})] = \\mathbb{E}[\\ln(u_i^{(2)})]`\n+\n+    where :math:`u_i^{(1)}` is the mean abundance for feature\n+    :math:`i` in the first group and :math:`u_i^{(2)}` is the\n+    mean abundance for feature :math:`i` in the second group.\n+\n+    This method can be extended to an arbitrary number of classes\n+    by passing in a different statistical function.\n+\n+    Parameters\n+    ----------\n+    table: pd.DataFrame or array_like\n+       A 2D matrix of counts or proportions where\n+       the rows correspond to samples and the\n+       columns correspond to features\n+    categories: pd.Series or 1D array_like\n+       Vector of categories\n+    alpha : float, optional\n+       Significance level for each of the statistical tests\n+    tau: float, optional\n+       A constant used to determine an appropriate\n+       cutoff\n+    theta : float, optional\n+       Lower bound for the proportion of differential features\n+    multiple_comparisons_correction: {None, 'holm-bonferroni'}, optional\n+       The multiple comparison correction procedure to run\n+    significance_test: function, optional\n+       A statistical signficance function to test for\n+       signficance between classes.\n+       The default is scipy.stats.ttest_ind\n+\n+    Returns:\n+    --------\n+    pd.DataFrame\n+        A table of features, their W-statistics and whether\n+        the null hypothesis is rejected\n+\n+    References\n+    ----------\n+    ..[1] Mandal et al. \"Analysis of composition of microbiomes:\n+          a novel method for studying microbial composition\",\n+          Microbial Ecology in Health & Disease, (2015), 26\n+\n+    Examples\n+    --------\n+    First import all of the necessary modules\n+\n+    >>> from skbio.stats.composition import ancom\n+    >>> import pandas as pd\n+\n+    Now lets load in a pandas dataframe with sample and feature ids\n+    for our data matrix\n+\n+    >>> table = pd.DataFrame(\n+    ...     [[10., 11., 10., 10., 10., 10., 10.],\n+    ...      [10.5, 11.5, 10.5, 10.5, 10.5, 10.5, 10.5],\n+    ...      [10., 11., 10., 10., 10., 10., 10.],\n+    ...      [20., 21., 10., 10., 10., 10., 10.],\n+    ...      [20.5, 21.5, 10.5, 10.5, 10.5, 10.5, 10.5],\n+    ...      [20.3, 21.3, 10.2, 10.3, 10.1, 10.6, 10.4]],\n+    ...     index=['s1','s2','s3','s4','s5','s6'],\n+    ...     columns=['b1','b2','b3','b4','b5','b6','b7'])\n+\n+    Then create a create a category vector.  In this scenerio, there\n+    are only two classes, so the first three samples fall under the first\n+    class while the last three samples fall under the last class\n+\n+    >>> cats = pd.Series([0, 0, 0, 1, 1, 1],\n+    ...                  index=['s1','s2','s3','s4','s5','s6'])\n+\n+    Now run ancom and see if there are any features that have any\n+    significant differences\n+\n+    >>> results = ancom(table, cats)\n+    >>> results['W']\n+    b1    6\n+    b2    6\n+    b3    2\n+    b4    2\n+    b5    2\n+    b6    2\n+    b7    2\n+    Name: W, dtype: int64\n+    >>> results['reject']\n+    b1     True\n+    b2     True\n+    b3    False\n+    b4    False\n+    b5    False\n+    b6    False\n+    b7    False\n+    Name: reject, dtype: bool\n+    \"\"\"\n+    if len(table) != len(categories):\n+        raise ValueError('The number of samples in mat needs' +\n+                         'to be the same as the number of samples' +\n+                         'in cats')\n+    if (multiple_comparisons_correction not in ['holm-bonferroni', None]):\n+        raise NotImplementedError('%s has not been implemented'\n+                                  % multiple_comparisons_correction)\n+\n+    mat = _check_composition(table, ignore_zeros=False)\n+    cats = pd.Series(categories)\n+\n+    mat.sort_index(inplace=True)\n+    cats = cats.sort_index()\n+    labs = mat.columns\n+\n+    n_samp, n_feat = mat.shape\n+\n+    _logratio_mat = _log_compare(mat.values, cats.values, significance_test)\n+    logratio_mat = _logratio_mat + _logratio_mat.T\n+\n+    # Multiple comparisons\n+    if multiple_comparisons_correction == 'holm-bonferroni':\n+        logratio_mat = np.apply_along_axis(_holm_bonferroni,\n+                                           1, logratio_mat)\n+    np.fill_diagonal(logratio_mat, 1)\n+    W = (logratio_mat < alpha).sum(axis=1)\n+    c_start = max(W) / n_feat\n+    if c_start < theta:\n+        reject = np.zeros_like(W, dtype=bool)\n+        return pd.DataFrame({'W': pd.Series(W, index=labs),\n+                             'reject': pd.Series(reject, index=labs)})\n+\n+    # Select appropriate cutoff\n+    cutoff = c_start - np.linspace(0.05, 0.25, 5)\n+    prop_cut = np.array([(W > n_feat*cut).mean() for cut in cutoff])\n+    dels = np.abs(prop_cut - np.roll(prop_cut, -1))\n+    dels[-1] = 0\n+    if (dels[1] < tau) and (dels[2] < tau) and (dels[3] < tau):\n+        nu = cutoff[1]\n+    elif (dels[1] >= tau) and (dels[2] < tau) and (dels[3] < tau):\n+        nu = cutoff[2]\n+    elif (dels[2] >= tau) and (dels[3] < tau) and (dels[4] < tau):\n+        nu = cutoff[3]\n+    else:\n+        nu = cutoff[4]\n+    reject = (W >= nu*n_feat)\n+    return pd.DataFrame({'W': pd.Series(W, index=labs),\n+                         'reject': pd.Series(reject, index=labs)})\n+\n+\n+def _check_composition(x, ignore_zeros=True):\n+    \"\"\"\n+    Checks to make sure that composition meets the mininum criteria\n+    Also casts composition into a pandas dataframe\n+\n+    Parameters\n+    ----------\n+    x : array_like or pd.DataFrame\n+       Input composition matrix\n+       where rows=samples and columns=features\n+    ignore_zeros : bool\n+       Specifies if compositions are allowed to have zeros\n+\n+    Returns\n+    -------\n+    pd.DataFrame\n+       Validated composition matrix\n+    \"\"\"\n+    if x.ndim > 2:\n+        raise ValueError(\"Input matrix can only have two dimensions or less\")\n+    if isinstance(x, pd.DataFrame):\n+        mat = closure(x)\n+        samp_labs = x.index\n+        feat_labs = x.columns\n+    else:\n+        mat = np.atleast_2d(x)\n+        r, c = mat.shape\n+        samp_labs = range(r)\n+        feat_labs = range(c)\n+    if np.any(mat == 0) and not ignore_zeros:\n+        raise ValueError('Cannot handle zeros in compositions. '\n+                         'Make sure to run a zero replacement method')\n+    return pd.DataFrame(mat, index=samp_labs, columns=feat_labs)\n+\n+\n+def _holm_bonferroni(p):\n+    \"\"\"\n+    Performs Holm-Bonferroni correction for pvalues\n+    to account for multiple comparisons\n+\n+    Parameters\n+    ---------\n+    p: numpy.array\n+        array of pvalues\n+\n+    Returns\n+    -------\n+    numpy.array\n+        corrected pvalues\n+    \"\"\"\n+    K = len(p)\n+    sort_index = -np.ones(K, dtype=np.int64)\n+    sorted_p = np.sort(p)\n+    sorted_p_adj = sorted_p*(K-np.arange(K))\n+    for j in range(K):\n+        idx = (p == sorted_p[j]) & (sort_index < 0)\n+        num_ties = len(sort_index[idx])\n+        sort_index[idx] = np.arange(j, (j+num_ties), dtype=np.int64)\n+\n+    sorted_holm_p = [min([max(sorted_p_adj[:k]), 1])\n+                     for k in range(1, K+1)]\n+    holm_p = [sorted_holm_p[sort_index[k]] for k in range(K)]\n+    return holm_p\n+\n+\n+def _log_compare(mat, cats,\n+                 significance_test=scipy.stats.ttest_ind):\n+    \"\"\"\n+    Calculates pairwise log ratios between all otus and performs a permutation\n+    tests to determine if there is a significant difference in OTU ratios with\n+    respect to the variable of interest\n+\n+    Parameters\n+    ----------\n+    mat: np.array\n+       rows = samples\n+       columns = features (i.e. OTUs)\n+    cats: np.array, float\n+       Vector of categories\n+    significance_test: function\n+        statistical test to run\n+\n+    Returns:\n+    --------\n+    log ratio pvalue matrix\n+    \"\"\"\n+    r, c = mat.shape\n+    log_ratio = np.zeros((c, c))\n+    log_mat = np.log(mat)\n+    cs = np.unique(cats)\n+\n+    def func(x):\n+        return significance_test(*[x[cats == k] for k in cs])\n+\n+    for i in range(c-1):\n+        ratio = (log_mat[:, i].T - log_mat[:, i+1:].T).T\n+        m, p = np.apply_along_axis(func,\n+                                   axis=0,\n+                                   arr=ratio)\n+        log_ratio[i, i+1:] = np.squeeze(np.array(p.T))\n+    return log_ratio\n+\n+\n def _gram_schmidt_basis(n):\n     \"\"\"\n     Builds clr transformed basis derived from","path":"skbio/stats/composition.py","position":303,"original_position":309,"commit_id":"7fbcb91e615ba24d48ff0dd406843d03350cfb8e","original_commit_id":"a75b682e85ba45bab2d57c01c62a661e78160309","user":{"login":"mortonjt","id":4184797,"avatar_url":"https://avatars.githubusercontent.com/u/4184797?v=3","gravatar_id":"","url":"https://api.github.com/users/mortonjt","html_url":"https://github.com/mortonjt","followers_url":"https://api.github.com/users/mortonjt/followers","following_url":"https://api.github.com/users/mortonjt/following{/other_user}","gists_url":"https://api.github.com/users/mortonjt/gists{/gist_id}","starred_url":"https://api.github.com/users/mortonjt/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/mortonjt/subscriptions","organizations_url":"https://api.github.com/users/mortonjt/orgs","repos_url":"https://api.github.com/users/mortonjt/repos","events_url":"https://api.github.com/users/mortonjt/events{/privacy}","received_events_url":"https://api.github.com/users/mortonjt/received_events","type":"User","site_admin":false},"body":"I'm willing to fix this, but I'm leaning towards opening a separate PR for that.","created_at":"2015-10-22T20:46:31Z","updated_at":"2015-10-22T20:46:31Z","html_url":"https://github.com/biocore/scikit-bio/pull/1114#discussion_r42803793","pull_request_url":"https://api.github.com/repos/biocore/scikit-bio/pulls/1114","_links":{"self":{"href":"https://api.github.com/repos/biocore/scikit-bio/pulls/comments/42803793"},"html":{"href":"https://github.com/biocore/scikit-bio/pull/1114#discussion_r42803793"},"pull_request":{"href":"https://api.github.com/repos/biocore/scikit-bio/pulls/1114"}}},"pull_request":{"url":"https://api.github.com/repos/biocore/scikit-bio/pulls/1114","id":44265665,"html_url":"https://github.com/biocore/scikit-bio/pull/1114","diff_url":"https://github.com/biocore/scikit-bio/pull/1114.diff","patch_url":"https://github.com/biocore/scikit-bio/pull/1114.patch","issue_url":"https://api.github.com/repos/biocore/scikit-bio/issues/1114","number":1114,"state":"open","locked":false,"title":"Ancom","user":{"login":"mortonjt","id":4184797,"avatar_url":"https://avatars.githubusercontent.com/u/4184797?v=3","gravatar_id":"","url":"https://api.github.com/users/mortonjt","html_url":"https://github.com/mortonjt","followers_url":"https://api.github.com/users/mortonjt/followers","following_url":"https://api.github.com/users/mortonjt/following{/other_user}","gists_url":"https://api.github.com/users/mortonjt/gists{/gist_id}","starred_url":"https://api.github.com/users/mortonjt/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/mortonjt/subscriptions","organizations_url":"https://api.github.com/users/mortonjt/orgs","repos_url":"https://api.github.com/users/mortonjt/repos","events_url":"https://api.github.com/users/mortonjt/events{/privacy}","received_events_url":"https://api.github.com/users/mortonjt/received_events","type":"User","site_admin":false},"body":"Here is the a PR for integrating ANCOM  this addresses #1054\r\n\r\nTo address @ebolyen 's concern, it is only a single function with a couple of helper functions.  If you guys think it is too beefy, let me know.\r\n\r\nAlso, there were some parameters in the most up to date version of ANCOM that didn't make complete sense to me.  @wdwvt1 , do you think you could address some of these parameters?  I highlighted them in the code.\r\n\r\nTodo:\r\n- [ ] squash commits","created_at":"2015-09-04T22:01:31Z","updated_at":"2015-10-22T20:46:31Z","closed_at":null,"merged_at":null,"merge_commit_sha":"c0cf69757c0b9b2964b3ee101a63e545cca6bebe","assignee":null,"milestone":null,"commits_url":"https://api.github.com/repos/biocore/scikit-bio/pulls/1114/commits","review_comments_url":"https://api.github.com/repos/biocore/scikit-bio/pulls/1114/comments","review_comment_url":"https://api.github.com/repos/biocore/scikit-bio/pulls/comments{/number}","comments_url":"https://api.github.com/repos/biocore/scikit-bio/issues/1114/comments","statuses_url":"https://api.github.com/repos/biocore/scikit-bio/statuses/7fbcb91e615ba24d48ff0dd406843d03350cfb8e","head":{"label":"mortonjt:ancom","ref":"ancom","sha":"7fbcb91e615ba24d48ff0dd406843d03350cfb8e","user":{"login":"mortonjt","id":4184797,"avatar_url":"https://avatars.githubusercontent.com/u/4184797?v=3","gravatar_id":"","url":"https://api.github.com/users/mortonjt","html_url":"https://github.com/mortonjt","followers_url":"https://api.github.com/users/mortonjt/followers","following_url":"https://api.github.com/users/mortonjt/following{/other_user}","gists_url":"https://api.github.com/users/mortonjt/gists{/gist_id}","starred_url":"https://api.github.com/users/mortonjt/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/mortonjt/subscriptions","organizations_url":"https://api.github.com/users/mortonjt/orgs","repos_url":"https://api.github.com/users/mortonjt/repos","events_url":"https://api.github.com/users/mortonjt/events{/privacy}","received_events_url":"https://api.github.com/users/mortonjt/received_events","type":"User","site_admin":false},"repo":{"id":23898042,"name":"scikit-bio","full_name":"mortonjt/scikit-bio","owner":{"login":"mortonjt","id":4184797,"avatar_url":"https://avatars.githubusercontent.com/u/4184797?v=3","gravatar_id":"","url":"https://api.github.com/users/mortonjt","html_url":"https://github.com/mortonjt","followers_url":"https://api.github.com/users/mortonjt/followers","following_url":"https://api.github.com/users/mortonjt/following{/other_user}","gists_url":"https://api.github.com/users/mortonjt/gists{/gist_id}","starred_url":"https://api.github.com/users/mortonjt/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/mortonjt/subscriptions","organizations_url":"https://api.github.com/users/mortonjt/orgs","repos_url":"https://api.github.com/users/mortonjt/repos","events_url":"https://api.github.com/users/mortonjt/events{/privacy}","received_events_url":"https://api.github.com/users/mortonjt/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/mortonjt/scikit-bio","description":"Core objects, functions and statistics for working with biological data in Python.","fork":true,"url":"https://api.github.com/repos/mortonjt/scikit-bio","forks_url":"https://api.github.com/repos/mortonjt/scikit-bio/forks","keys_url":"https://api.github.com/repos/mortonjt/scikit-bio/keys{/key_id}","collaborators_url":"https://api.github.com/repos/mortonjt/scikit-bio/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/mortonjt/scikit-bio/teams","hooks_url":"https://api.github.com/repos/mortonjt/scikit-bio/hooks","issue_events_url":"https://api.github.com/repos/mortonjt/scikit-bio/issues/events{/number}","events_url":"https://api.github.com/repos/mortonjt/scikit-bio/events","assignees_url":"https://api.github.com/repos/mortonjt/scikit-bio/assignees{/user}","branches_url":"https://api.github.com/repos/mortonjt/scikit-bio/branches{/branch}","tags_url":"https://api.github.com/repos/mortonjt/scikit-bio/tags","blobs_url":"https://api.github.com/repos/mortonjt/scikit-bio/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/mortonjt/scikit-bio/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/mortonjt/scikit-bio/git/refs{/sha}","trees_url":"https://api.github.com/repos/mortonjt/scikit-bio/git/trees{/sha}","statuses_url":"https://api.github.com/repos/mortonjt/scikit-bio/statuses/{sha}","languages_url":"https://api.github.com/repos/mortonjt/scikit-bio/languages","stargazers_url":"https://api.github.com/repos/mortonjt/scikit-bio/stargazers","contributors_url":"https://api.github.com/repos/mortonjt/scikit-bio/contributors","subscribers_url":"https://api.github.com/repos/mortonjt/scikit-bio/subscribers","subscription_url":"https://api.github.com/repos/mortonjt/scikit-bio/subscription","commits_url":"https://api.github.com/repos/mortonjt/scikit-bio/commits{/sha}","git_commits_url":"https://api.github.com/repos/mortonjt/scikit-bio/git/commits{/sha}","comments_url":"https://api.github.com/repos/mortonjt/scikit-bio/comments{/number}","issue_comment_url":"https://api.github.com/repos/mortonjt/scikit-bio/issues/comments{/number}","contents_url":"https://api.github.com/repos/mortonjt/scikit-bio/contents/{+path}","compare_url":"https://api.github.com/repos/mortonjt/scikit-bio/compare/{base}...{head}","merges_url":"https://api.github.com/repos/mortonjt/scikit-bio/merges","archive_url":"https://api.github.com/repos/mortonjt/scikit-bio/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/mortonjt/scikit-bio/downloads","issues_url":"https://api.github.com/repos/mortonjt/scikit-bio/issues{/number}","pulls_url":"https://api.github.com/repos/mortonjt/scikit-bio/pulls{/number}","milestones_url":"https://api.github.com/repos/mortonjt/scikit-bio/milestones{/number}","notifications_url":"https://api.github.com/repos/mortonjt/scikit-bio/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/mortonjt/scikit-bio/labels{/name}","releases_url":"https://api.github.com/repos/mortonjt/scikit-bio/releases{/id}","created_at":"2014-09-11T00:39:57Z","updated_at":"2015-04-15T23:45:33Z","pushed_at":"2015-10-22T20:09:58Z","git_url":"git://github.com/mortonjt/scikit-bio.git","ssh_url":"git@github.com:mortonjt/scikit-bio.git","clone_url":"https://github.com/mortonjt/scikit-bio.git","svn_url":"https://github.com/mortonjt/scikit-bio","homepage":"http://scikit-bio.org","size":34635,"stargazers_count":0,"watchers_count":0,"language":"Python","has_issues":false,"has_downloads":true,"has_wiki":true,"has_pages":true,"forks_count":0,"mirror_url":null,"open_issues_count":0,"forks":0,"open_issues":0,"watchers":0,"default_branch":"master"}},"base":{"label":"biocore:master","ref":"master","sha":"81a1ce5acb434603c537f832caee64a76db19190","user":{"login":"biocore","id":6241857,"avatar_url":"https://avatars.githubusercontent.com/u/6241857?v=3","gravatar_id":"","url":"https://api.github.com/users/biocore","html_url":"https://github.com/biocore","followers_url":"https://api.github.com/users/biocore/followers","following_url":"https://api.github.com/users/biocore/following{/other_user}","gists_url":"https://api.github.com/users/biocore/gists{/gist_id}","starred_url":"https://api.github.com/users/biocore/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/biocore/subscriptions","organizations_url":"https://api.github.com/users/biocore/orgs","repos_url":"https://api.github.com/users/biocore/repos","events_url":"https://api.github.com/users/biocore/events{/privacy}","received_events_url":"https://api.github.com/users/biocore/received_events","type":"Organization","site_admin":false},"repo":{"id":15168264,"name":"scikit-bio","full_name":"biocore/scikit-bio","owner":{"login":"biocore","id":6241857,"avatar_url":"https://avatars.githubusercontent.com/u/6241857?v=3","gravatar_id":"","url":"https://api.github.com/users/biocore","html_url":"https://github.com/biocore","followers_url":"https://api.github.com/users/biocore/followers","following_url":"https://api.github.com/users/biocore/following{/other_user}","gists_url":"https://api.github.com/users/biocore/gists{/gist_id}","starred_url":"https://api.github.com/users/biocore/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/biocore/subscriptions","organizations_url":"https://api.github.com/users/biocore/orgs","repos_url":"https://api.github.com/users/biocore/repos","events_url":"https://api.github.com/users/biocore/events{/privacy}","received_events_url":"https://api.github.com/users/biocore/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/biocore/scikit-bio","description":"scikit-bio is an open-source, BSD-licensed, Python package providing data structures, algorithms, and educational resources for bioinformatics.","fork":false,"url":"https://api.github.com/repos/biocore/scikit-bio","forks_url":"https://api.github.com/repos/biocore/scikit-bio/forks","keys_url":"https://api.github.com/repos/biocore/scikit-bio/keys{/key_id}","collaborators_url":"https://api.github.com/repos/biocore/scikit-bio/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/biocore/scikit-bio/teams","hooks_url":"https://api.github.com/repos/biocore/scikit-bio/hooks","issue_events_url":"https://api.github.com/repos/biocore/scikit-bio/issues/events{/number}","events_url":"https://api.github.com/repos/biocore/scikit-bio/events","assignees_url":"https://api.github.com/repos/biocore/scikit-bio/assignees{/user}","branches_url":"https://api.github.com/repos/biocore/scikit-bio/branches{/branch}","tags_url":"https://api.github.com/repos/biocore/scikit-bio/tags","blobs_url":"https://api.github.com/repos/biocore/scikit-bio/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/biocore/scikit-bio/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/biocore/scikit-bio/git/refs{/sha}","trees_url":"https://api.github.com/repos/biocore/scikit-bio/git/trees{/sha}","statuses_url":"https://api.github.com/repos/biocore/scikit-bio/statuses/{sha}","languages_url":"https://api.github.com/repos/biocore/scikit-bio/languages","stargazers_url":"https://api.github.com/repos/biocore/scikit-bio/stargazers","contributors_url":"https://api.github.com/repos/biocore/scikit-bio/contributors","subscribers_url":"https://api.github.com/repos/biocore/scikit-bio/subscribers","subscription_url":"https://api.github.com/repos/biocore/scikit-bio/subscription","commits_url":"https://api.github.com/repos/biocore/scikit-bio/commits{/sha}","git_commits_url":"https://api.github.com/repos/biocore/scikit-bio/git/commits{/sha}","comments_url":"https://api.github.com/repos/biocore/scikit-bio/comments{/number}","issue_comment_url":"https://api.github.com/repos/biocore/scikit-bio/issues/comments{/number}","contents_url":"https://api.github.com/repos/biocore/scikit-bio/contents/{+path}","compare_url":"https://api.github.com/repos/biocore/scikit-bio/compare/{base}...{head}","merges_url":"https://api.github.com/repos/biocore/scikit-bio/merges","archive_url":"https://api.github.com/repos/biocore/scikit-bio/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/biocore/scikit-bio/downloads","issues_url":"https://api.github.com/repos/biocore/scikit-bio/issues{/number}","pulls_url":"https://api.github.com/repos/biocore/scikit-bio/pulls{/number}","milestones_url":"https://api.github.com/repos/biocore/scikit-bio/milestones{/number}","notifications_url":"https://api.github.com/repos/biocore/scikit-bio/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/biocore/scikit-bio/labels{/name}","releases_url":"https://api.github.com/repos/biocore/scikit-bio/releases{/id}","created_at":"2013-12-13T16:24:41Z","updated_at":"2015-10-12T19:04:25Z","pushed_at":"2015-10-22T20:09:59Z","git_url":"git://github.com/biocore/scikit-bio.git","ssh_url":"git@github.com:biocore/scikit-bio.git","clone_url":"https://github.com/biocore/scikit-bio.git","svn_url":"https://github.com/biocore/scikit-bio","homepage":"http://scikit-bio.org","size":42177,"stargazers_count":165,"watchers_count":165,"language":"Python","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":true,"forks_count":90,"mirror_url":null,"open_issues_count":166,"forks":90,"open_issues":166,"watchers":165,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/biocore/scikit-bio/pulls/1114"},"html":{"href":"https://github.com/biocore/scikit-bio/pull/1114"},"issue":{"href":"https://api.github.com/repos/biocore/scikit-bio/issues/1114"},"comments":{"href":"https://api.github.com/repos/biocore/scikit-bio/issues/1114/comments"},"review_comments":{"href":"https://api.github.com/repos/biocore/scikit-bio/pulls/1114/comments"},"review_comment":{"href":"https://api.github.com/repos/biocore/scikit-bio/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/biocore/scikit-bio/pulls/1114/commits"},"statuses":{"href":"https://api.github.com/repos/biocore/scikit-bio/statuses/7fbcb91e615ba24d48ff0dd406843d03350cfb8e"}}}}