বিজ্ঞান-শিখতে লিনিয়াররেগ্রেশন-এ পি-মান (তাত্পর্য) সন্ধান করুন


154

আমি কীভাবে প্রতিটি সহগের পি-মান (তাত্পর্য) খুঁজে পেতে পারি?

lm = sklearn.linear_model.LinearRegression()
lm.fit(x,y)

2
আপনার উত্তর নয়, তবে অন্যের কাছে একটি উত্তর হতে পারে: স্কিপি লিঙ্গरे শনে
ডেভআরজিপি

এটি কেবলমাত্র এক মাত্রার বনাম একটি মাত্রার জন্য কাজ করে।
রিচার্ড লিয়াং

উত্তর:


162

এটি একরকম ওভারকিলের মতো তবে আসুন এটি একবার দেখা যাক। প্রথমে পি-মানগুলি কী হওয়া উচিত তা নির্ধারণ করতে স্ট্যাটাসমডেল ব্যবহার করতে দিন

import pandas as pd
import numpy as np
from sklearn import datasets, linear_model
from sklearn.linear_model import LinearRegression
import statsmodels.api as sm
from scipy import stats

diabetes = datasets.load_diabetes()
X = diabetes.data
y = diabetes.target

X2 = sm.add_constant(X)
est = sm.OLS(y, X2)
est2 = est.fit()
print(est2.summary())

এবং আমরা পেতে

                         OLS Regression Results                            
==============================================================================
Dep. Variable:                      y   R-squared:                       0.518
Model:                            OLS   Adj. R-squared:                  0.507
Method:                 Least Squares   F-statistic:                     46.27
Date:                Wed, 08 Mar 2017   Prob (F-statistic):           3.83e-62
Time:                        10:08:24   Log-Likelihood:                -2386.0
No. Observations:                 442   AIC:                             4794.
Df Residuals:                     431   BIC:                             4839.
Df Model:                          10                                         
Covariance Type:            nonrobust                                         
==============================================================================
                 coef    std err          t      P>|t|      [0.025      0.975]
------------------------------------------------------------------------------
const        152.1335      2.576     59.061      0.000     147.071     157.196
x1           -10.0122     59.749     -0.168      0.867    -127.448     107.424
x2          -239.8191     61.222     -3.917      0.000    -360.151    -119.488
x3           519.8398     66.534      7.813      0.000     389.069     650.610
x4           324.3904     65.422      4.958      0.000     195.805     452.976
x5          -792.1842    416.684     -1.901      0.058   -1611.169      26.801
x6           476.7458    339.035      1.406      0.160    -189.621    1143.113
x7           101.0446    212.533      0.475      0.635    -316.685     518.774
x8           177.0642    161.476      1.097      0.273    -140.313     494.442
x9           751.2793    171.902      4.370      0.000     413.409    1089.150
x10           67.6254     65.984      1.025      0.306     -62.065     197.316
==============================================================================
Omnibus:                        1.506   Durbin-Watson:                   2.029
Prob(Omnibus):                  0.471   Jarque-Bera (JB):                1.404
Skew:                           0.017   Prob(JB):                        0.496
Kurtosis:                       2.726   Cond. No.                         227.
==============================================================================

ঠিক আছে, এর পুনরুত্পাদন করা যাক। এটি ম্যাট্রিক্স বীজগণিত ব্যবহার করে লিনিয়ার রিগ্রেশন বিশ্লেষণ প্রায় পুনরুত্পাদন করার কারণে এটি ওভারকিল জাতীয় of তবে কি হ্যাক।

lm = LinearRegression()
lm.fit(X,y)
params = np.append(lm.intercept_,lm.coef_)
predictions = lm.predict(X)

newX = pd.DataFrame({"Constant":np.ones(len(X))}).join(pd.DataFrame(X))
MSE = (sum((y-predictions)**2))/(len(newX)-len(newX.columns))

# Note if you don't want to use a DataFrame replace the two lines above with
# newX = np.append(np.ones((len(X),1)), X, axis=1)
# MSE = (sum((y-predictions)**2))/(len(newX)-len(newX[0]))

var_b = MSE*(np.linalg.inv(np.dot(newX.T,newX)).diagonal())
sd_b = np.sqrt(var_b)
ts_b = params/ sd_b

p_values =[2*(1-stats.t.cdf(np.abs(i),(len(newX)-len(newX[0])))) for i in ts_b]

sd_b = np.round(sd_b,3)
ts_b = np.round(ts_b,3)
p_values = np.round(p_values,3)
params = np.round(params,4)

myDF3 = pd.DataFrame()
myDF3["Coefficients"],myDF3["Standard Errors"],myDF3["t values"],myDF3["Probabilities"] = [params,sd_b,ts_b,p_values]
print(myDF3)

এবং এটি আমাদের দেয়।

    Coefficients  Standard Errors  t values  Probabilities
0       152.1335            2.576    59.061         0.000
1       -10.0122           59.749    -0.168         0.867
2      -239.8191           61.222    -3.917         0.000
3       519.8398           66.534     7.813         0.000
4       324.3904           65.422     4.958         0.000
5      -792.1842          416.684    -1.901         0.058
6       476.7458          339.035     1.406         0.160
7       101.0446          212.533     0.475         0.635
8       177.0642          161.476     1.097         0.273
9       751.2793          171.902     4.370         0.000
10       67.6254           65.984     1.025         0.306

সুতরাং আমরা স্ট্যাটাসমডেল থেকে মানগুলি পুনরুত্পাদন করতে পারি।


2
এর অর্থ কী যে আমার ভার_বি সব ন্যান? লিনিয়ার বীজগণিত অংশ ব্যর্থ হওয়ার কোনও অন্তর্নিহিত কারণ আছে কি?
ফামারগার

এটি কেন হতে পারে তা অনুমান করা সত্যিই কঠিন। আমি আপনার তথ্য কাঠামো তাকান এবং উদাহরণ সঙ্গে এটি তুলনা করতে হবে। এটি একটি ক্লু সরবরাহ করতে পারে।
জারহ

1
দেখে মনে হচ্ছে codenp.linalg.inv কখনও কখনও ম্যাট্রিক্সটি অ-পরিবর্তনীয় না হলেও এমনকি ফলাফল ফিরিয়ে দিতে পারে। এটা সমস্যা হতে পারে।
জেআরএইচ

7
@ ফাফমার্গে আমারও সকলের সমস্যা ছিল nan। আমার জন্য এটি কারণ আমার Xসূত্রগুলি বন্ধ ছিল তাই আমার ডেটাগুলির একটি নমুনা ছিল। কল করার সময় এটি ত্রুটি ঘটায় pd.DataFrame.join()। আমি এই এক লাইনের পরিবর্তন করেছি এবং এটি এখন কাজ করছে বলে মনে হচ্ছে:newX = pd.DataFrame({"Constant":np.ones(len(X))}).join(pd.DataFrame(X.reset_index(drop=True)))
ফল্ট

1
@ mLstudent33 "সম্ভাব্যতা" কলাম।
skeller88

52

সাইকিট-লার্নের লিনিয়ারআগ্রেশন এই তথ্যটি গণনা করে না তবে আপনি এটি করতে ক্লাসটি সহজেই প্রসারিত করতে পারেন:

from sklearn import linear_model
from scipy import stats
import numpy as np


class LinearRegression(linear_model.LinearRegression):
    """
    LinearRegression class after sklearn's, but calculate t-statistics
    and p-values for model coefficients (betas).
    Additional attributes available after .fit()
    are `t` and `p` which are of the shape (y.shape[1], X.shape[1])
    which is (n_features, n_coefs)
    This class sets the intercept to 0 by default, since usually we include it
    in X.
    """

    def __init__(self, *args, **kwargs):
        if not "fit_intercept" in kwargs:
            kwargs['fit_intercept'] = False
        super(LinearRegression, self)\
                .__init__(*args, **kwargs)

    def fit(self, X, y, n_jobs=1):
        self = super(LinearRegression, self).fit(X, y, n_jobs)

        sse = np.sum((self.predict(X) - y) ** 2, axis=0) / float(X.shape[0] - X.shape[1])
        se = np.array([
            np.sqrt(np.diagonal(sse[i] * np.linalg.inv(np.dot(X.T, X))))
                                                    for i in range(sse.shape[0])
                    ])

        self.t = self.coef_ / se
        self.p = 2 * (1 - stats.t.cdf(np.abs(self.t), y.shape[0] - X.shape[1]))
        return self

এখান থেকে চুরি ।

পাইথনের এই জাতীয় পরিসংখ্যান বিশ্লেষণের জন্য আপনার স্ট্যাটাসমডেলগুলি একবার দেখে নেওয়া উচিত ।


আমরা হব. এটি কাজ করতে পারে না কারণ sse একটি স্কেলার তাই sse.shape আসলে কিছুই বোঝায় না।
আশু

15

সম্পাদনা: সম্ভবত এটি করার সঠিক উপায় নয়, মন্তব্য দেখুন

আপনি sklearn.feature_selection.f_regression ব্যবহার করতে পারেন।

সাইকিট শিখুন পৃষ্ঠার জন্য এখানে ক্লিক করুন


1
তাহলে এফ-টেস্ট গুলো কি? আমি ভেবেছিলাম রৈখিক প্রতিরোধের জন্য পি-মানগুলি প্রতিটি পৃথক রেগ্রেসারের জন্য সাধারণত ছিল, এবং এটি একটি গুণমানের গুণক 0 টির তুলনায় একটি পরীক্ষা ছিল? একটি ভাল উত্তরের জন্য ফাংশনটির আরও ব্যাখ্যা করা দরকার।
শব্দসুবিহীন

@WordsForthewise ডকুমেন্টেশন পৃষ্ঠাতে বলা হয়েছে যে প্রত্যাবর্তিত মান পি_ভ্যালুগুলির একটি অ্যারে। সুতরাং এটি প্রতিটি পৃথক নিবন্ধকের জন্য সত্যই মূল্যবান value
আশু

1
সঠিক না হওয়ায় এই পদ্ধতিটি ব্যবহার করবেন না! এটি অবিচ্ছিন্ন প্রতিক্রিয়া সম্পাদন করে তবে আপনি সম্ভবত একটি একক মাল্টিভারিয়েট রিগ্রেশন চান
ব্যবহারকারী 357269

1
না, f_regression ব্যবহার করবেন না। প্রত্যেকটি গুণফলের আসল পি-মানটি ডেটা ফিটিংয়ের পরে প্রতিটি সহগের জন্য টি টেস্ট থেকে আসা উচিত। স্কলারনে f_regression টি অবিচ্ছিন্ন রিগ্রেশন থেকে আসে। এটি মোডটি তৈরি করে নি, কেবল প্রতিটি ভেরিয়েবলের জন্য f স্কোর গণনা করে। স্ক্লার্নে চি 2 ফাংশন হিসাবে একই এটি সঠিক: এসএম মোড = এসএমএলএস (ওয়াই, এক্স) হিসাবে স্ট্যাটাসমডেলস.এপিআই আমদানি করুন
রিচার্ড লিয়াং

@ রিচার্ডলিয়াং, কোন অ্যালগরিদমের জন্য পি-ভ্যালু (মাল্টিভারিয়েট) গণনা করার জন্য sm.OLS () ব্যবহারের সঠিক উপায়? (যেমন সিদ্ধান্ত গাছ, এসএমএম, কে-মানে, লজিস্টিক রিগ্রেশন ইত্যাদি)? আমি পি-মান পেতে একটি জেনেরিক পদ্ধতি চাই। ধন্যবাদ
গিলিয়ান

11

এলিয়াসের উত্তরের কোড https://stackoverflow.com/a/27928411/4240413 আসলে কাজ করে না। লক্ষ্য করুন যে sse একটি স্কেলার, এবং তারপরে এটি এর মাধ্যমে পুনরাবৃত্তি করার চেষ্টা করে। নিম্নলিখিত কোডটি একটি পরিবর্তিত সংস্করণ। আশ্চর্যজনকভাবে পরিষ্কার নয়, তবে আমি মনে করি এটি কম বেশি কাজ করে।

class LinearRegression(linear_model.LinearRegression):

    def __init__(self,*args,**kwargs):
        # *args is the list of arguments that might go into the LinearRegression object
        # that we don't know about and don't want to have to deal with. Similarly, **kwargs
        # is a dictionary of key words and values that might also need to go into the orginal
        # LinearRegression object. We put *args and **kwargs so that we don't have to look
        # these up and write them down explicitly here. Nice and easy.

        if not "fit_intercept" in kwargs:
            kwargs['fit_intercept'] = False

        super(LinearRegression,self).__init__(*args,**kwargs)

    # Adding in t-statistics for the coefficients.
    def fit(self,x,y):
        # This takes in numpy arrays (not matrices). Also assumes you are leaving out the column
        # of constants.

        # Not totally sure what 'super' does here and why you redefine self...
        self = super(LinearRegression, self).fit(x,y)
        n, k = x.shape
        yHat = np.matrix(self.predict(x)).T

        # Change X and Y into numpy matricies. x also has a column of ones added to it.
        x = np.hstack((np.ones((n,1)),np.matrix(x)))
        y = np.matrix(y).T

        # Degrees of freedom.
        df = float(n-k-1)

        # Sample variance.     
        sse = np.sum(np.square(yHat - y),axis=0)
        self.sampleVariance = sse/df

        # Sample variance for x.
        self.sampleVarianceX = x.T*x

        # Covariance Matrix = [(s^2)(X'X)^-1]^0.5. (sqrtm = matrix square root.  ugly)
        self.covarianceMatrix = sc.linalg.sqrtm(self.sampleVariance[0,0]*self.sampleVarianceX.I)

        # Standard erros for the difference coefficients: the diagonal elements of the covariance matrix.
        self.se = self.covarianceMatrix.diagonal()[1:]

        # T statistic for each beta.
        self.betasTStat = np.zeros(len(self.se))
        for i in xrange(len(self.se)):
            self.betasTStat[i] = self.coef_[0,i]/self.se[i]

        # P-value for each beta. This is a two sided t-test, since the betas can be 
        # positive or negative.
        self.betasPValue = 1 - t.cdf(abs(self.betasTStat),df)

8

পি-মানগুলি টানার একটি সহজ উপায় হ'ল স্ট্যাটাস মডেলস রিগ্রেশন ব্যবহার করা:

import statsmodels.api as sm
mod = sm.OLS(Y,X)
fii = mod.fit()
p_values = fii.summary2().tables[1]['P>|t|']

আপনি পি-মানগুলির একটি সিরিজ পান যা আপনি পরিচালনা করতে পারেন (উদাহরণস্বরূপ প্রতিটি পি-মানকে মূল্যায়ন করে আপনি যে ক্রমটি রাখতে চান তা চয়ন করুন):

এখানে চিত্র বর্ণনা লিখুন


Sm.OLS () ব্যবহার করুন কোনও অ্যালগরিদমের জন্য পি-মান (মাল্টিভারিয়েট) গণনা করার সঠিক উপায়? (যেমন সিদ্ধান্ত গাছ, এসএমএম, কে-মানে, লজিস্টিক রিগ্রেশন ইত্যাদি)? আমি পি-মান পেতে একটি জেনেরিক পদ্ধতি চাই। ধন্যবাদ
গিলিয়ান

7

p_value f পরিসংখ্যানগুলির মধ্যে একটি। আপনি যদি মান পেতে চান তবে কেবল কোডের এই কয়েকটি লাইন ব্যবহার করুন:

import statsmodels.api as sm
from scipy import stats

diabetes = datasets.load_diabetes()
X = diabetes.data
y = diabetes.target

X2 = sm.add_constant(X)
est = sm.OLS(y, X2)
print(est.fit().f_pvalue)

3
আপনি উল্লিখিতের চেয়ে আলাদা লাইব্রেরি ব্যবহার করছেন বলে এটি প্রশ্নের উত্তর দেয় না।
জেনেট হয়েছে

@ জেনেটেড এমন পরিস্থিতিতে কী কী আছে যেখানে গণনার একটি পদ্ধতি অন্যের চেয়ে ভাল হবে?
ডন কুইক্সোট

6

মাল্টিভেরিয়েবল রিগ্রেশন ক্ষেত্রে @ জারহ'এর উত্তরে একটি ভুল হতে পারে । (মন্তব্য করার মতো যথেষ্ট খ্যাতি আমার নেই।)

নিম্নলিখিত লাইনে:

p_values =[2*(1-stats.t.cdf(np.abs(i),(len(newX)-1))) for i in ts_b],

টি-মানগুলি ডিগ্রির চি-স্কোয়ার ডিস্ট্রিবিউশন অনুসরণ না করে ডিগ্রির len(newX)-1চি-স্কোয়ার্ড বিতরণ অনুসরণ করে len(newX)-len(newX.columns)-1

সুতরাং এটি হওয়া উচিত:

p_values =[2*(1-stats.t.cdf(np.abs(i),(len(newX)-len(newX.columns)-1))) for i in ts_b]

( আরও তথ্যের জন্য ওএলএস রিগ্রেশন-এর টি-মানগুলি দেখুন)


5

আপনি পি-মান জন্য স্কিপি ব্যবহার করতে পারেন । এই কোডটি স্কিপি ডকুমেন্টেশন থেকে।

>>> from scipy import stats
>>> import numpy as np
>>> x = np.random.random(10)
>>> y = np.random.random(10)
>>> slope, intercept, r_value, p_value, std_err = stats.linregress(x,y)

1
আমি মনে করি না এটি ফিট করার সময় একাধিক ভেক্টর ব্যবহারের ক্ষেত্রে প্রযোজ্য
O.rka

1

ওয়ান-লাইনারের জন্য আপনি পিংগুইন.লাইনার_গ্রেশন ফাংশন ( অস্বীকৃতি: আমি পিংইউইনের স্রষ্টা ) ব্যবহার করতে পারেন, যা ইউএনআই / মাল্টি-ভেরিয়েটে রিগ্রেশন সহ নুমপি অ্যারে বা পান্ডাস ডেটা ফ্রেম ব্যবহার করে কাজ করে, যেমন:

import pingouin as pg
# Using a Pandas DataFrame `df`:
lm = pg.linear_regression(df[['x', 'z']], df['y'])
# Using a NumPy array:
lm = pg.linear_regression(X, y)

আউটপুটটি হ'ল বিটা সহগ, স্ট্যান্ডার্ড ত্রুটি, টি-মান, পি-মান এবং প্রতিটি ভবিষ্যদ্বাণীকারীর জন্য আত্মবিশ্বাসের বিরতি, পাশাপাশি আর ^ 2 এবং ফিটের আরড R 2 সমন্বিত একটি ডেটাফ্রেম।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.