簡體   English   中英

線性回歸殘差 - 我應該“標准化”結果以及如何執行此操作

[英]Linear Regression Residuals - Should I “standardise” the results and how to do this

我是一名生物學家。 我想復制一種我在論文中讀到的方法:“為了允許獨立於體重調查與死亡率的關聯,通過從觀察值中減去預測來計算死亡率的殘差”。

我有一套死亡率(范圍從大約0.1到0.5),一組體重(范圍從大約2到80),我想計算在考慮體重后死亡率的殘差。

我寫了這段代碼:

import scipy
from scipy import stats
import sys


# This reads in the weight and mortality data to two lists. 
Weight = []
Mortality = []
for line in open(sys.argv[1]):
        line = line.strip().split()
        Weight.append(float(line[-2]))
        Mortality.append(float(line[-1]))

# This calculates the regression equation.
slope, intercept, r_value, p_value, std_err = scipy.stats.linregress(Mortality,Weight)

# This calculates the predicted value for each observed value
obs_values = Mortality
pred_values = []
for i in obs_values:
    pred_i = float(i) * float(slope) + float(intercept)
    pred_values.append(pred_i)

# This prints the residual for each pair of observations
for obs_v,pred_v in zip(obs_values,pred_values):
    Residual = str(obs_v - pred_v)
    print Residual

我的問題是,當我運行此代碼時,我的一些殘差看起來很大:

 > Sample1 839.710240214 > Sample2 325.787250084 > Sample3 -41.3006000084 > Sample4 -70.6676280159 > Sample5 267.05319407 > Sample6 399.204820103 > Sample7 560.723474144 > Sample8 766.292670196 > Sample9 267.05319407 > Sample10 2.7499420027 

我想知道,這些結果看起來是“正常的”/它們是否應該以某種方式“標准化”/我是否做了一些錯誤以獲得重量后的死亡率殘差?

如果可能的話,我會很感激簡單的“普通英語”答案和可能的代碼片段,因為我不是統計專家!

非常感謝

看看scipy.stats.linregess()的文檔:第一個參數是x ,橫坐標,第二個參數是y ,你的觀察值。 因此,如果obs_values = Mortality應該是觀察值,則必須置換線性回歸的兩個參數,並且必須基於權Weight x (而非Mortalityy )計算預測值:

# This calculates the regression equation.
slope, intercept, r_value, p_value, std_err = scipy.stats.linregress(x=Weight, y=Mortality)

# This calculates the predicted value for each observed value
obs_values = Mortality
pred_values = []
for i in Weight:
    pred_i = float(i) * float(slope) + float(intercept)
    pred_values.append(pred_i)

另外,你可以通過使用numpy(scipy無論如何使用它)來大幅減少(並加速)你的代碼。

import numpy as np
from scipy import stats
import sys

# This reads in the weight and mortality data to two arrays.
arr = np.loadtxt(sys.argv[1])
Weight = arr[:,-2]
Mortality = arr[:,-1]

# This calculates the regression equation.
slope, intercept, r_value, p_value, std_err = stats.linregress(x=Weight,y=Mortality)

# This calculates the predicted value for each observed value
obs_values = Mortality
pred_values = slope * Weight + intercept

# This prints the residual for each pair of observations
Residual = obs_values - pred_values
print(Residuals)

我知道我不打算在這里問一個跟進問題,如果有人能告訴我如何繼續討論我的原始問題(帶代碼而沒有字符數)而不點擊“回答問題”,我會很樂意搬家這段文字; 我道歉。

我的最后一個問題是如何“允許對死亡率的關聯進行獨立於體重調查”。 我的下一個問題只是出於好奇,如果要擴大這個問題,如果我想檢查死亡率,獨立於體重和身高?

我已經編寫了這段代碼,對於我的數據,這些殘差確實加起來為0,但我只是想與專家核實這是我將要討論的方式以供將來參考:

import numpy as np
import statsmodels.formula.api as smf
import sys

dat = np.loadtxt(sys.argv[1],dtype={"names":("SpeciesName","Mortality","Height","Weight"),"formats":("S40","f4","f4","f4")})
mymodel = smf.ols("Mortality~Height+Weight",data=dat).fit()
Residues = list(mymodel.resid_pearson)
SpeciesList = list(dat["SpeciesName"])
for species,residue in zip(SpeciesList,Residues):
    print species + "\t" + str(residue)

如果我在錯誤的部分寫了這個,我再一次道歉; 我不覺得這是一個新問題,作為評論,我無法添加代碼; 如果更合適,我很樂意將這個問題作為一個新問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM