python - 双对数图上的线性拟合不是线性的

标签 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

最佳答案

你在这里混淆了事情。问题是 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")

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

关于python - 双对数图上的线性拟合不是线性的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53674804/

相关文章:

根据最终销售额订购 'tag line' 事件的算法

python - Bootstrap 方法和置信区间

ruby - 如何找到 Ruby 整数数组/散列的异常值?

python - 为什么参数的数量与分类变量的数量不同?

python - 如何在 Python sklearn 中添加交互项

python - 从类本身内部引用属性

python - 通过解释器变异混淆 python 字节码

python - 使用 Python 和 Boto3 列出 S3 存储桶的目录内容?

python - 如何替换匹配条件的选定行的列中的字符串

r - 如何生成像 cor() 这样的线性回归矩阵