【问题标题】:linear fit on log-log plot isn't linear对数图上的线性拟合不是线性的
【发布时间】:2019-05-09 12:45:08
【问题描述】:

我正在尝试分析一项实验的重现性。我用 0.1 替换了 0 值,并用对数轴绘制了两个实验的数据。到目前为止,一切顺利。

接下来,我得到两列中的值都 > 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()

但这就是我得到的,它绝对不是线性的:

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

编辑:

链接到初始dataset

【问题讨论】:

  • 好吧,你已经创建了一条线 y = m x + b 并绘制了它,但 m x + b 不会是一条线,因为轴是对数的。尝试绘制 y = m log(x) + b 或者 log(y) = m log(x) + b (不确定,你必须把它整理出来)。
  • 我尝试将x 替换为np.log10(x)y 也是如此)但它只会产生更奇怪的线条..
  • 能否请您发布原始数据的链接?
  • @JamesPhillips 是的,当然,我编辑了问题并添加了下载链接!

标签: python statistics linear-regression


【解决方案1】:

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

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

【讨论】:

  • 这给了我一个更奇怪的输出(见 [i.stack.imgur.com/htRJ5.png] )。
  • 你可以试试x = np.logspace(-1, 5, base=10)然后plt.plot(x, np.log10(y), c='orange', label="fit")
  • 是的。它仍然不是线性拟合.. [i.stack.imgur.com/oHrYq.png]
  • 分享一些数据让我自己试试
  • 应其他用户的要求,我刚刚编辑了问题并添加了一个链接以下载我正在处理的数据集。感谢您的帮助!
【解决方案2】:

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

【讨论】:

  • 线性轴的散点图压缩过大。我也设法通过线性轴获得了该输出,但这里真正的问题是对数轴。感谢您对此进行调查,但这不是我需要的答案。
猜你喜欢
  • 1970-01-01
  • 2015-05-30
  • 2017-06-27
  • 2019-03-15
  • 1970-01-01
  • 2016-11-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多