2016-03-23 4 views
1

私は生物学者です。私は論文で読んだアプローチをコピーしたい:「死亡率との関連を体重とは無関係に調べるために、死亡率の残差は観測値から予測値を差し引いて計算する」。線形回帰残差 - 結果を「標準化」し、これを行う方法

私は死亡率のセット(約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 

私は思ったんだけど、これらの結果は何らかの形で「標準化」されるべきであるか、または重量を考慮した死亡率の残差を得るのに間違ったことをしたのでしょうか?

私は統計的な専門家ではないので、可能であれば、コードスニペットを使って単純な「プレーン・英語」の回答に感謝します。 、最初の引数はxある横軸を、第二はy、あなたの観測値である:

感謝

+0

まず、正しいものを見つける必要があります。あなたのコードを修正することができます – niklas

+0

残余は0にする必要があります、あなたの数字はそうそうではありません。一方、あなたの与えられた出力はコードから切り離されているように見えます。あなたのコードには何も "Sample"という語が印刷されていないからです。 –

+0

あなたのモデルでは、 '死亡率'は独立していて、 'Weight'は従属変数です。人の死亡率の確率/尤度が自分の体重に影響すると主張していない場合、それは逆の方法でなければならないと私は思う。 – ayhan

答えて

1

scipy.stats.linregess()の文書に見てみましょう。だから、obs_values = Mortalityあなたは、線形回帰の二つの引数を並べ替えるとxとしてWeight(ない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

私はあなたもforループを変更すべきだと思います。 'i''が' Mortality'に対して反復されるが、 'Weight'では反復されないので' pred_i = float(i)* float(slope)+ float(intercept) 'は依然として間違っています。 – ayhan

+1

はい、回答後も見ました。私はまだそれを編集しました。 – Chickenmarkus

+0

ありがとうございました。残差が0になり、数字は非現実的に高くはありません。私は間違いなく、もっと気が狂っています。私はそれがここでどのように役立つだろうかを見ることができます。 – Tom

0

「の回答私はこのテキストをそのセクションに喜んで移動します。謝罪します。

私の最後の質問は、「死亡率との関連を体重とは別に調べることを許可する」ということでした。私の次の質問は、好奇心から外れています。これを拡大するならば、体重や身長とは無関係に死亡率を検討したいと言っていましたか?

私はこれらの残差が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) 

もう一度、私が間違ったセクションでこれを書いた場合は謝ります。私はそれが新しい質問であるとは思わなかったし、コメントとして私はコードを追加できなかった。それがより適切であれば、私は喜んでこれを新しい質問にします。

関連する問題