线性回归残差我应该“标准化”的结果和如何做到这一点

2024-06-16 11:06:20 发布

您现在位置:Python中文网/ 问答频道 /正文

我是生物学家。我想复制我在一篇论文中读到的方法:“为了能够独立于体重来研究与死亡率的关系,死亡率的残差是通过从观察值中减去预测值来计算的”。在

我有一组死亡率(范围从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

我想知道,这些结果看起来“正常”吗/它们是否应该以某种方式“标准化”/我是否做错了什么来获得计算体重后的死亡率残差?在

如果可能的话,我会很感激简单的“纯英语”答案,如果可能的话,因为我不是统计专家!在

非常感谢


Tags: theinimportforvaluelinefloatthis
2条回答

我知道我不想在这里提出后续问题,如果有人能告诉我如何在不单击“回答问题”的情况下继续讨论我的原始问题(带代码,不带字符数),我很乐意将此文本移到该部分;我道歉。在

我的最后一个问题是如何“允许独立于体重调查与死亡率的关系”。我的下一个问题是出于好奇,如果要扩展这个问题,比如说,我是否想独立于体重和身高来研究死亡率?在

我写了这段代码,对于我的数据,这些残差加起来等于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)

再次道歉,如果我写错了这一节;我不觉得这是一个新的问题,作为一个评论,我不能添加代码;如果这是更合适的话,我很乐意把这个问题变成一个新的问题。在

看一下^{}的文档:第一个参数是x,横坐标,第二个参数是y,你观察到的值。{{{cd7}的值不应该根据cd2}来计算

# 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(scpy无论如何都会使用它)来大幅减少(并加速)代码。在

^{pr2}$

相关问题 更多 >