We are currently solving the following issue within our repository. Here is the issue text:
--- BEGIN ISSUE ---
nonparametric.KDEUnivariate returns zero bandwidth
Hi,
Does anyone have an idea why the following dataset makes KDEUnivariate return zero bandwidth?

```
data = np.array([1,1,1,1,2])
kde_sm = sm.nonparametric.KDEUnivariate(data.astype('double'))
kde_sm.fit(bw="silverman")
sup = kde_sm.support
den = kde_sm.density
print(kde_sm.bw) # prints 0
```
when `data = np.array([1,1,1,2])` the returned bandwidth is correct. When I add more 1s, the bandwidth stays zero.

Thank you!

--- END ISSUE ---

Below are some code segments, each from a relevant file. One or more of these files may contain bugs.
--- BEGIN FILES ---
Path: `statsmodels/nonparametric/bandwidths.py`
Content:
```
1 import numpy as np
2 from scipy.stats import scoreatpercentile as sap
3 
4 from statsmodels.compat.pandas import Substitution
5 from statsmodels.sandbox.nonparametric import kernels
6 
7 def _select_sigma(X):
8     """
9     Returns the smaller of std(X, ddof=1) or normalized IQR(X) over axis 0.
10 
11     References
12     ----------
13     Silverman (1986) p.47
14     """
15 #    normalize = norm.ppf(.75) - norm.ppf(.25)
16     normalize = 1.349
17 #    IQR = np.subtract.reduce(percentile(X, [75,25],
18 #                             axis=axis), axis=axis)/normalize
19     IQR = (sap(X, 75) - sap(X, 25))/normalize
20     return np.minimum(np.std(X, axis=0, ddof=1), IQR)
21 
22 
23 ## Univariate Rule of Thumb Bandwidths ##
24 def bw_scott(x, kernel=None):
25     """
26     Scott's Rule of Thumb
27 
28     Parameters
29     ----------
30     x : array_like
31         Array for which to get the bandwidth
32     kernel : CustomKernel object
33         Unused
34 
35     Returns
36     -------
37     bw : float
38         The estimate of the bandwidth
39 
40     Notes
41     -----
42     Returns 1.059 * A * n ** (-1/5.) where ::
43 
44        A = min(std(x, ddof=1), IQR/1.349)
45        IQR = np.subtract.reduce(np.percentile(x, [75,25]))
46 
47     References
48     ----------
49 
50     Scott, D.W. (1992) Multivariate Density Estimation: Theory, Practice, and
51         Visualization.
52     """
53     A = _select_sigma(x)
54     n = len(x)
55     return 1.059 * A * n ** (-0.2)
56 
57 def bw_silverman(x, kernel=None):
58     """
59     Silverman's Rule of Thumb
60 
61     Parameters
62     ----------
63     x : array_like
64         Array for which to get the bandwidth
65     kernel : CustomKernel object
66         Unused
67 
68     Returns
69     -------
70     bw : float
71         The estimate of the bandwidth
72 
73     Notes
74     -----
75     Returns .9 * A * n ** (-1/5.) where ::
76 
77        A = min(std(x, ddof=1), IQR/1.349)
78        IQR = np.subtract.reduce(np.percentile(x, [75,25]))
79 
80     References
81     ----------
82 
83     Silverman, B.W. (1986) `Density Estimation.`
84     """
85     A = _select_sigma(x)
86     n = len(x)
87     return .9 * A * n ** (-0.2)
88 
89 
90 def bw_normal_reference(x, kernel=kernels.Gaussian):
91     """
92     Plug-in bandwidth with kernel specific constant based on normal reference.
93 
94     This bandwidth minimizes the mean integrated square error if the true
95     distribution is the normal. This choice is an appropriate bandwidth for
96     single peaked distributions that are similar to the normal distribution.
97 
98     Parameters
99     ----------
100     x : array_like
101         Array for which to get the bandwidth
102     kernel : CustomKernel object
103         Used to calculate the constant for the plug-in bandwidth.
104 
105     Returns
106     -------
107     bw : float
108         The estimate of the bandwidth
109 
110     Notes
111     -----
112     Returns C * A * n ** (-1/5.) where ::
113 
114        A = min(std(x, ddof=1), IQR/1.349)
115        IQR = np.subtract.reduce(np.percentile(x, [75,25]))
116        C = constant from Hansen (2009)
117 
118     When using a Gaussian kernel this is equivalent to the 'scott' bandwidth up
119     to two decimal places. This is the accuracy to which the 'scott' constant is
120     specified.
121 
122     References
123     ----------
124 
125     Silverman, B.W. (1986) `Density Estimation.`
126     Hansen, B.E. (2009) `Lecture Notes on Nonparametrics.`
127     """
128     C = kernel.normal_reference_constant
129     A = _select_sigma(x)
130     n = len(x)
131     return C * A * n ** (-0.2)
132 
133 ## Plug-In Methods ##
134 
135 ## Least Squares Cross-Validation ##
136 
137 ## Helper Functions ##
138 
139 bandwidth_funcs = {
140     "scott": bw_scott,
141     "silverman": bw_silverman,
142     "normal_reference": bw_normal_reference,
143 }
144 
145 
146 @Substitution(", ".join(sorted(bandwidth_funcs.keys())))
147 def select_bandwidth(x, bw, kernel):
148     """
149     Selects bandwidth for a selection rule bw
150 
151     this is a wrapper around existing bandwidth selection rules
152 
153     Parameters
154     ----------
155     x : array_like
156         Array for which to get the bandwidth
157     bw : str
158         name of bandwidth selection rule, currently supported are:
159         %s
160     kernel : not used yet
161 
162     Returns
163     -------
164     bw : float
165         The estimate of the bandwidth
166 
167     """
168     bw = bw.lower()
169     if bw not in bandwidth_funcs:
170         raise ValueError("Bandwidth %s not understood" % bw)
171 #TODO: uncomment checks when we have non-rule of thumb bandwidths for diff. kernels
172 #    if kernel == "gauss":
173     return bandwidth_funcs[bw](x, kernel)
174 #    else:
175 #        raise ValueError("Only Gaussian Kernels are currently supported")
176
```
--- END FILES ---

Please first localize the bug based on the issue statement, and then generate a patch according to the `git diff` format fenced by three backticks.

Here is an example:

```diff
diff --git a/examples/server_async.py b/examples/server_async.py
--- a/examples/server_async.py
+++ b/examples/server_async.py
@@ -313,4 +313,4 @@
 
 
 if __name__ == "__main__":
-    asyncio.run(run_async_server("."), debug=True)
+    asyncio.run(run_async_server(), debug=True)
diff --git a/examples/server_sync.py b/examples/server_sync.py
--- a/examples/server_sync.py
+++ b/examples/server_sync.py
@@ -313,5 +313,5 @@
 
 
 if __name__ == "__main__":
-    server = run_sync_server(".")
+    server = run_sync_server()
     server.shutdown()

```

diff --git a/statsmodels/nonparametric/bandwidths.py b/statsmodels/nonparametric/bandwidths.py
--- a/statsmodels/nonparametric/bandwidths.py
+++ b/statsmodels/nonparametric/bandwidths.py
@@ -168,8 +168,10 @@
     bw = bw.lower()
     if bw not in bandwidth_funcs:
         raise ValueError("Bandwidth %s not understood" % bw)
-#TODO: uncomment checks when we have non-rule of thumb bandwidths for diff. kernels
-#    if kernel == "gauss":
-    return bandwidth_funcs[bw](x, kernel)
-#    else:
-#        raise ValueError("Only Gaussian Kernels are currently supported")
+    bandwidth = bandwidth_funcs[bw](x, kernel)
+    if bandwidth == 0:
+        # eventually this can fall back on another selection criterion.
+        err = "Selected KDE bandwidth is 0. Cannot estiamte density."
+        raise RuntimeError(err)
+    else:
+        return bandwidth

{"golden_diff": "diff --git a/statsmodels/nonparametric/bandwidths.py b/statsmodels/nonparametric/bandwidths.py\n--- a/statsmodels/nonparametric/bandwidths.py\n+++ b/statsmodels/nonparametric/bandwidths.py\n@@ -168,8 +168,10 @@\n     bw = bw.lower()\n     if bw not in bandwidth_funcs:\n         raise ValueError(\"Bandwidth %s not understood\" % bw)\n-#TODO: uncomment checks when we have non-rule of thumb bandwidths for diff. kernels\n-#    if kernel == \"gauss\":\n-    return bandwidth_funcs[bw](x, kernel)\n-#    else:\n-#        raise ValueError(\"Only Gaussian Kernels are currently supported\")\n+    bandwidth = bandwidth_funcs[bw](x, kernel)\n+    if bandwidth == 0:\n+        # eventually this can fall back on another selection criterion.\n+        err = \"Selected KDE bandwidth is 0. Cannot estiamte density.\"\n+        raise RuntimeError(err)\n+    else:\n+        return bandwidth\n", "issue": "nonparametric.KDEUnivariate returns zero bandwidth\nHi,\r\nDoes anyone have an idea why the following dataset makes KDEUnivariate return zero bandwidth?\r\n\r\n```\r\ndata = np.array([1,1,1,1,2])\r\nkde_sm = sm.nonparametric.KDEUnivariate(data.astype('double'))\r\nkde_sm.fit(bw=\"silverman\")\r\nsup = kde_sm.support\r\nden = kde_sm.density\r\nprint(kde_sm.bw) # prints 0\r\n```\r\nwhen `data = np.array([1,1,1,2])` the returned bandwidth is correct. When I add more 1s, the bandwidth stays zero.\r\n\r\nThank you!\n", "before_files": [{"content": "import numpy as np\nfrom scipy.stats import scoreatpercentile as sap\n\nfrom statsmodels.compat.pandas import Substitution\nfrom statsmodels.sandbox.nonparametric import kernels\n\ndef _select_sigma(X):\n    \"\"\"\n    Returns the smaller of std(X, ddof=1) or normalized IQR(X) over axis 0.\n\n    References\n    ----------\n    Silverman (1986) p.47\n    \"\"\"\n#    normalize = norm.ppf(.75) - norm.ppf(.25)\n    normalize = 1.349\n#    IQR = np.subtract.reduce(percentile(X, [75,25],\n#                             axis=axis), axis=axis)/normalize\n    IQR = (sap(X, 75) - sap(X, 25))/normalize\n    return np.minimum(np.std(X, axis=0, ddof=1), IQR)\n\n\n## Univariate Rule of Thumb Bandwidths ##\ndef bw_scott(x, kernel=None):\n    \"\"\"\n    Scott's Rule of Thumb\n\n    Parameters\n    ----------\n    x : array_like\n        Array for which to get the bandwidth\n    kernel : CustomKernel object\n        Unused\n\n    Returns\n    -------\n    bw : float\n        The estimate of the bandwidth\n\n    Notes\n    -----\n    Returns 1.059 * A * n ** (-1/5.) where ::\n\n       A = min(std(x, ddof=1), IQR/1.349)\n       IQR = np.subtract.reduce(np.percentile(x, [75,25]))\n\n    References\n    ----------\n\n    Scott, D.W. (1992) Multivariate Density Estimation: Theory, Practice, and\n        Visualization.\n    \"\"\"\n    A = _select_sigma(x)\n    n = len(x)\n    return 1.059 * A * n ** (-0.2)\n\ndef bw_silverman(x, kernel=None):\n    \"\"\"\n    Silverman's Rule of Thumb\n\n    Parameters\n    ----------\n    x : array_like\n        Array for which to get the bandwidth\n    kernel : CustomKernel object\n        Unused\n\n    Returns\n    -------\n    bw : float\n        The estimate of the bandwidth\n\n    Notes\n    -----\n    Returns .9 * A * n ** (-1/5.) where ::\n\n       A = min(std(x, ddof=1), IQR/1.349)\n       IQR = np.subtract.reduce(np.percentile(x, [75,25]))\n\n    References\n    ----------\n\n    Silverman, B.W. (1986) `Density Estimation.`\n    \"\"\"\n    A = _select_sigma(x)\n    n = len(x)\n    return .9 * A * n ** (-0.2)\n\n\ndef bw_normal_reference(x, kernel=kernels.Gaussian):\n    \"\"\"\n    Plug-in bandwidth with kernel specific constant based on normal reference.\n\n    This bandwidth minimizes the mean integrated square error if the true\n    distribution is the normal. This choice is an appropriate bandwidth for\n    single peaked distributions that are similar to the normal distribution.\n\n    Parameters\n    ----------\n    x : array_like\n        Array for which to get the bandwidth\n    kernel : CustomKernel object\n        Used to calculate the constant for the plug-in bandwidth.\n\n    Returns\n    -------\n    bw : float\n        The estimate of the bandwidth\n\n    Notes\n    -----\n    Returns C * A * n ** (-1/5.) where ::\n\n       A = min(std(x, ddof=1), IQR/1.349)\n       IQR = np.subtract.reduce(np.percentile(x, [75,25]))\n       C = constant from Hansen (2009)\n\n    When using a Gaussian kernel this is equivalent to the 'scott' bandwidth up\n    to two decimal places. This is the accuracy to which the 'scott' constant is\n    specified.\n\n    References\n    ----------\n\n    Silverman, B.W. (1986) `Density Estimation.`\n    Hansen, B.E. (2009) `Lecture Notes on Nonparametrics.`\n    \"\"\"\n    C = kernel.normal_reference_constant\n    A = _select_sigma(x)\n    n = len(x)\n    return C * A * n ** (-0.2)\n\n## Plug-In Methods ##\n\n## Least Squares Cross-Validation ##\n\n## Helper Functions ##\n\nbandwidth_funcs = {\n    \"scott\": bw_scott,\n    \"silverman\": bw_silverman,\n    \"normal_reference\": bw_normal_reference,\n}\n\n\n@Substitution(\", \".join(sorted(bandwidth_funcs.keys())))\ndef select_bandwidth(x, bw, kernel):\n    \"\"\"\n    Selects bandwidth for a selection rule bw\n\n    this is a wrapper around existing bandwidth selection rules\n\n    Parameters\n    ----------\n    x : array_like\n        Array for which to get the bandwidth\n    bw : str\n        name of bandwidth selection rule, currently supported are:\n        %s\n    kernel : not used yet\n\n    Returns\n    -------\n    bw : float\n        The estimate of the bandwidth\n\n    \"\"\"\n    bw = bw.lower()\n    if bw not in bandwidth_funcs:\n        raise ValueError(\"Bandwidth %s not understood\" % bw)\n#TODO: uncomment checks when we have non-rule of thumb bandwidths for diff. kernels\n#    if kernel == \"gauss\":\n    return bandwidth_funcs[bw](x, kernel)\n#    else:\n#        raise ValueError(\"Only Gaussian Kernels are currently supported\")\n", "path": "statsmodels/nonparametric/bandwidths.py"}], "after_files": [{"content": "import numpy as np\nfrom scipy.stats import scoreatpercentile as sap\n\nfrom statsmodels.compat.pandas import Substitution\nfrom statsmodels.sandbox.nonparametric import kernels\n\ndef _select_sigma(X):\n    \"\"\"\n    Returns the smaller of std(X, ddof=1) or normalized IQR(X) over axis 0.\n\n    References\n    ----------\n    Silverman (1986) p.47\n    \"\"\"\n#    normalize = norm.ppf(.75) - norm.ppf(.25)\n    normalize = 1.349\n#    IQR = np.subtract.reduce(percentile(X, [75,25],\n#                             axis=axis), axis=axis)/normalize\n    IQR = (sap(X, 75) - sap(X, 25))/normalize\n    return np.minimum(np.std(X, axis=0, ddof=1), IQR)\n\n\n## Univariate Rule of Thumb Bandwidths ##\ndef bw_scott(x, kernel=None):\n    \"\"\"\n    Scott's Rule of Thumb\n\n    Parameters\n    ----------\n    x : array_like\n        Array for which to get the bandwidth\n    kernel : CustomKernel object\n        Unused\n\n    Returns\n    -------\n    bw : float\n        The estimate of the bandwidth\n\n    Notes\n    -----\n    Returns 1.059 * A * n ** (-1/5.) where ::\n\n       A = min(std(x, ddof=1), IQR/1.349)\n       IQR = np.subtract.reduce(np.percentile(x, [75,25]))\n\n    References\n    ----------\n\n    Scott, D.W. (1992) Multivariate Density Estimation: Theory, Practice, and\n        Visualization.\n    \"\"\"\n    A = _select_sigma(x)\n    n = len(x)\n    return 1.059 * A * n ** (-0.2)\n\ndef bw_silverman(x, kernel=None):\n    \"\"\"\n    Silverman's Rule of Thumb\n\n    Parameters\n    ----------\n    x : array_like\n        Array for which to get the bandwidth\n    kernel : CustomKernel object\n        Unused\n\n    Returns\n    -------\n    bw : float\n        The estimate of the bandwidth\n\n    Notes\n    -----\n    Returns .9 * A * n ** (-1/5.) where ::\n\n       A = min(std(x, ddof=1), IQR/1.349)\n       IQR = np.subtract.reduce(np.percentile(x, [75,25]))\n\n    References\n    ----------\n\n    Silverman, B.W. (1986) `Density Estimation.`\n    \"\"\"\n    A = _select_sigma(x)\n    n = len(x)\n    return .9 * A * n ** (-0.2)\n\n\ndef bw_normal_reference(x, kernel=kernels.Gaussian):\n    \"\"\"\n    Plug-in bandwidth with kernel specific constant based on normal reference.\n\n    This bandwidth minimizes the mean integrated square error if the true\n    distribution is the normal. This choice is an appropriate bandwidth for\n    single peaked distributions that are similar to the normal distribution.\n\n    Parameters\n    ----------\n    x : array_like\n        Array for which to get the bandwidth\n    kernel : CustomKernel object\n        Used to calculate the constant for the plug-in bandwidth.\n\n    Returns\n    -------\n    bw : float\n        The estimate of the bandwidth\n\n    Notes\n    -----\n    Returns C * A * n ** (-1/5.) where ::\n\n       A = min(std(x, ddof=1), IQR/1.349)\n       IQR = np.subtract.reduce(np.percentile(x, [75,25]))\n       C = constant from Hansen (2009)\n\n    When using a Gaussian kernel this is equivalent to the 'scott' bandwidth up\n    to two decimal places. This is the accuracy to which the 'scott' constant is\n    specified.\n\n    References\n    ----------\n\n    Silverman, B.W. (1986) `Density Estimation.`\n    Hansen, B.E. (2009) `Lecture Notes on Nonparametrics.`\n    \"\"\"\n    C = kernel.normal_reference_constant\n    A = _select_sigma(x)\n    n = len(x)\n    return C * A * n ** (-0.2)\n\n## Plug-In Methods ##\n\n## Least Squares Cross-Validation ##\n\n## Helper Functions ##\n\nbandwidth_funcs = {\n    \"scott\": bw_scott,\n    \"silverman\": bw_silverman,\n    \"normal_reference\": bw_normal_reference,\n}\n\n\n@Substitution(\", \".join(sorted(bandwidth_funcs.keys())))\ndef select_bandwidth(x, bw, kernel):\n    \"\"\"\n    Selects bandwidth for a selection rule bw\n\n    this is a wrapper around existing bandwidth selection rules\n\n    Parameters\n    ----------\n    x : array_like\n        Array for which to get the bandwidth\n    bw : str\n        name of bandwidth selection rule, currently supported are:\n        %s\n    kernel : not used yet\n\n    Returns\n    -------\n    bw : float\n        The estimate of the bandwidth\n\n    \"\"\"\n    bw = bw.lower()\n    if bw not in bandwidth_funcs:\n        raise ValueError(\"Bandwidth %s not understood\" % bw)\n    bandwidth = bandwidth_funcs[bw](x, kernel)\n    if bandwidth == 0:\n        # eventually this can fall back on another selection criterion.\n        err = \"Selected KDE bandwidth is 0. Cannot estiamte density.\"\n        raise RuntimeError(err)\n    else:\n        return bandwidth\n", "path": "statsmodels/nonparametric/bandwidths.py"}]}