对数对数图上的线性拟合不是线性的

时间:2018-12-07 18:07:32

标签: python statistics linear-regression

我正在尝试分析一个实验的可重复性。我将0值替换为0.1,并用对数-对数轴绘制了两个实验的数据。到目前为止,一切都很好。

接下来,我得到的行中两列的值均> 0,并根据这些值的log10计算了线性回归。我得到了线性拟合的斜率和截距,然后尝试绘制它。

import pandas as pd
import numpy as np

table = pd.read_csv("data.csv")
data = table.replace(0, 0.1)
plt.plot(data["run1"], data["run2"], color="#03012d", marker=".", ls="None", markersize=3, label="")

plt.xscale('log')
plt.yscale('log')
plt.axis('square')
plt.xlabel("1st experiment")
plt.ylabel("2nd experiment")

from scipy.stats import linregress

df = table.loc[(table['run1'] >0) & (table['run2'] >0)]

stats = linregress(np.log10(df["run1"]),np.log10(df["run2"]))

m = stats.slope
b = stats.intercept
r = stats.rvalue

x = np.logspace(-1, 5, base=10)
y = (m*x+b)

plt.plot(x, y, c='orange', label="fit")
plt.legend()

但这是我得到的,而且绝对不是线性的: plot

我不知道我在做什么错..

编辑:

链接到最初的dataset

2 个答案:

答案 0 :(得分:0)

您在这里使事情变得混乱。问题是np.logspace(-1, 5, base=10)只是返回对数间隔的值,但您仍然需要取x值的以10为底的对数,因为图中的x轴是对数(np.log10(x) ),然后执行以下

x = np.log10(np.logspace(-1, 5, base=10))
y = (m*x + b)
plt.plot(x, y, c='orange', label="fit")

这将为您提供期望的线性回归线性预测。

答案 1 :(得分:0)

当我目视检查数据的散点图时,我发现记录日志没有任何用处。通过原始数据的一条直线看起来可能是您在这里可以做的最好的事情,请参阅随附的图像。 scatter

linear