prompt: You will be provided with a partial code base and an issue statement explaining a problem to resolve.
  <issue>
  [MAINT/CLN] remove function explicitly marked as duplicate
  In the function docstring:
  `duplicate: Skipper added sm.tools.drop_missing`
  
  <b>update</b> The relevant function is not used outside this module; nor is the other function in this module.
  
  </issue>
  <code>
  [start of statsmodels/tools/wrappers.py]
  1 # -*- coding: utf-8 -*-
  2 """Convenience Wrappers
  3 
  4 Created on Sat Oct 30 14:56:35 2010
  5 
  6 Author: josef-pktd
  7 License: BSD
  8 """
  9 
  10 import numpy as np
  11 import statsmodels.api as sm
  12 from statsmodels import GLS, WLS, OLS
  13 
  14 def remove_nanrows(y, x):
  15     '''remove common rows in [y,x] that contain at least one nan
  16 
  17     TODO: this should be made more flexible,
  18      arbitrary number of arrays and 1d or 2d arrays
  19 
  20     duplicate: Skipper added sm.tools.drop_missing
  21 
  22     '''
  23     mask = ~np.isnan(y)
  24     mask *= ~(np.isnan(x).any(-1))  #* or &
  25     y = y[mask]
  26     x = x[mask]
  27     return y, x
  28 
  29 
  30 def linmod(y, x, weights=None, sigma=None, add_const=True, filter_missing=True,
  31            **kwds):
  32     '''get linear model with extra options for entry
  33 
  34     dispatches to regular model class and does not wrap the output
  35 
  36     If several options are exclusive, for example sigma and weights, then the
  37     chosen class depends on the implementation sequence.
  38     '''
  39 
  40     if filter_missing:
  41         y, x = remove_nanrows(y, x)
  42         #do the same for masked arrays
  43 
  44     if add_const:
  45         x = sm.add_constant(x, prepend=True)
  46 
  47     if not sigma is None:
  48         return GLS(y, x, sigma=sigma, **kwds)
  49     elif not weights is None:
  50         return WLS(y, x, weights=weights, **kwds)
  51     else:
  52         return OLS(y, x, **kwds)
  53
  [end of statsmodels/tools/wrappers.py]
  </code>
  
  I need you to solve this issue by generating a single patch file that I can apply directly to this repository using git apply. Please respond with a single patch file in the following format.
  <patch>
  diff --git a/file.py b/file.py
  --- a/file.py
  +++ b/file.py
  @@ -1,27 +1,35 @@
   def euclidean(a, b):
  -    while b:
  -        a, b = b, a % b
  -    return a
  +    if b == 0:
  +        return a
  +    return euclidean(b, a % b)
   
   
   def bresenham(x0, y0, x1, y1):
       points = []
       dx = abs(x1 - x0)
       dy = abs(y1 - y0)
  -    sx = 1 if x0 < x1 else -1
  -    sy = 1 if y0 < y1 else -1
  -    err = dx - dy
  +    x, y = x0, y0
  +    sx = -1 if x0 > x1 else 1
  +    sy = -1 if y0 > y1 else 1
   
  -    while True:
  -        points.append((x0, y0))
  -        if x0 == x1 and y0 == y1:
  -            break
  -        e2 = 2 * err
  -        if e2 > -dy:
  -            err -= dy
  -            x0 += sx
  -        if e2 < dx:
  -            err += dx
  -            y0 += sy
  +    if dx > dy:
  +        err = dx / 2.0
  +        while x != x1:
  +            points.append((x, y))
  +            err -= dy
  +            if err < 0:
  +                y += sy
  +                err += dx
  +            x += sx
  +    else:
  +        err = dy / 2.0
  +        while y != y1:
  +            points.append((x, y))
  +            err -= dx
  +            if err < 0:
  +                x += sx
  +                err += dy
  +            y += sy
  +
  +    points.append((x, y))
       return points
  
  </patch>
golden_diff: diff --git a/statsmodels/tools/wrappers.py b/statsmodels/tools/wrappers.py
  deleted file mode 100644
  --- a/statsmodels/tools/wrappers.py
  +++ /dev/null
  @@ -1,52 +0,0 @@
  -# -*- coding: utf-8 -*-
  -"""Convenience Wrappers
  -
  -Created on Sat Oct 30 14:56:35 2010
  -
  -Author: josef-pktd
  -License: BSD
  -"""
  -
  -import numpy as np
  -import statsmodels.api as sm
  -from statsmodels import GLS, WLS, OLS
  -
  -def remove_nanrows(y, x):
  -    '''remove common rows in [y,x] that contain at least one nan
  -
  -    TODO: this should be made more flexible,
  -     arbitrary number of arrays and 1d or 2d arrays
  -
  -    duplicate: Skipper added sm.tools.drop_missing
  -
  -    '''
  -    mask = ~np.isnan(y)
  -    mask *= ~(np.isnan(x).any(-1))  #* or &
  -    y = y[mask]
  -    x = x[mask]
  -    return y, x
  -
  -
  -def linmod(y, x, weights=None, sigma=None, add_const=True, filter_missing=True,
  -           **kwds):
  -    '''get linear model with extra options for entry
  -
  -    dispatches to regular model class and does not wrap the output
  -
  -    If several options are exclusive, for example sigma and weights, then the
  -    chosen class depends on the implementation sequence.
  -    '''
  -
  -    if filter_missing:
  -        y, x = remove_nanrows(y, x)
  -        #do the same for masked arrays
  -
  -    if add_const:
  -        x = sm.add_constant(x, prepend=True)
  -
  -    if not sigma is None:
  -        return GLS(y, x, sigma=sigma, **kwds)
  -    elif not weights is None:
  -        return WLS(y, x, weights=weights, **kwds)
  -    else:
  -        return OLS(y, x, **kwds)
  
verification_info: {"golden_diff": "diff --git a/statsmodels/tools/wrappers.py b/statsmodels/tools/wrappers.py\ndeleted file mode 100644\n--- a/statsmodels/tools/wrappers.py\n+++ /dev/null\n@@ -1,52 +0,0 @@\n-# -*- coding: utf-8 -*-\n-\"\"\"Convenience Wrappers\n-\n-Created on Sat Oct 30 14:56:35 2010\n-\n-Author: josef-pktd\n-License: BSD\n-\"\"\"\n-\n-import numpy as np\n-import statsmodels.api as sm\n-from statsmodels import GLS, WLS, OLS\n-\n-def remove_nanrows(y, x):\n-    '''remove common rows in [y,x] that contain at least one nan\n-\n-    TODO: this should be made more flexible,\n-     arbitrary number of arrays and 1d or 2d arrays\n-\n-    duplicate: Skipper added sm.tools.drop_missing\n-\n-    '''\n-    mask = ~np.isnan(y)\n-    mask *= ~(np.isnan(x).any(-1))  #* or &\n-    y = y[mask]\n-    x = x[mask]\n-    return y, x\n-\n-\n-def linmod(y, x, weights=None, sigma=None, add_const=True, filter_missing=True,\n-           **kwds):\n-    '''get linear model with extra options for entry\n-\n-    dispatches to regular model class and does not wrap the output\n-\n-    If several options are exclusive, for example sigma and weights, then the\n-    chosen class depends on the implementation sequence.\n-    '''\n-\n-    if filter_missing:\n-        y, x = remove_nanrows(y, x)\n-        #do the same for masked arrays\n-\n-    if add_const:\n-        x = sm.add_constant(x, prepend=True)\n-\n-    if not sigma is None:\n-        return GLS(y, x, sigma=sigma, **kwds)\n-    elif not weights is None:\n-        return WLS(y, x, weights=weights, **kwds)\n-    else:\n-        return OLS(y, x, **kwds)\n", "issue": "[MAINT/CLN] remove function explicitly marked as duplicate\nIn the function docstring:\r\n`duplicate: Skipper added sm.tools.drop_missing`\r\n\r\n<b>update</b> The relevant function is not used outside this module; nor is the other function in this module.\n", "before_files": [{"content": "# -*- coding: utf-8 -*-\n\"\"\"Convenience Wrappers\n\nCreated on Sat Oct 30 14:56:35 2010\n\nAuthor: josef-pktd\nLicense: BSD\n\"\"\"\n\nimport numpy as np\nimport statsmodels.api as sm\nfrom statsmodels import GLS, WLS, OLS\n\ndef remove_nanrows(y, x):\n    '''remove common rows in [y,x] that contain at least one nan\n\n    TODO: this should be made more flexible,\n     arbitrary number of arrays and 1d or 2d arrays\n\n    duplicate: Skipper added sm.tools.drop_missing\n\n    '''\n    mask = ~np.isnan(y)\n    mask *= ~(np.isnan(x).any(-1))  #* or &\n    y = y[mask]\n    x = x[mask]\n    return y, x\n\n\ndef linmod(y, x, weights=None, sigma=None, add_const=True, filter_missing=True,\n           **kwds):\n    '''get linear model with extra options for entry\n\n    dispatches to regular model class and does not wrap the output\n\n    If several options are exclusive, for example sigma and weights, then the\n    chosen class depends on the implementation sequence.\n    '''\n\n    if filter_missing:\n        y, x = remove_nanrows(y, x)\n        #do the same for masked arrays\n\n    if add_const:\n        x = sm.add_constant(x, prepend=True)\n\n    if not sigma is None:\n        return GLS(y, x, sigma=sigma, **kwds)\n    elif not weights is None:\n        return WLS(y, x, weights=weights, **kwds)\n    else:\n        return OLS(y, x, **kwds)\n", "path": "statsmodels/tools/wrappers.py"}]}