[英]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
(而非Mortality
為y
)計算預測值:
# 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.