我想在R中对正常和双对数图中的数据进行线性回归.
对于普通数据,数据集可能是以下数据:
lin <- data.frame(x = c(0:6), y = c(0.3, 0.1, 0.9, 3.1, 5, 4.9, 6.2))
plot (lin$x, lin$y)
Run Code Online (Sandbox Code Playgroud)
在那里,我想计算只为数据点2,3和4的线性回归画一条线.
对于双对数数据,数据集可能如下:
data = data.frame(
x=c(1:15),
y=c(
1.000, 0.742, 0.623, 0.550, 0.500, 0.462, 0.433,
0.051, 0.043, 0.037, 0.032, 0.028, 0.025, 0.022, 0.020
)
)
plot (data$x, data$y, log="xy")
Run Code Online (Sandbox Code Playgroud)
在这里,我想绘制数据集1:7和8:15的回归线.
我可以计算斜率和y偏移量作为拟合的参数(R ^ 2,p值)吗?
如何对正常和对数数据做?
谢谢你的帮助,
斯文
在R中,如何设置特定变量的权重而不是lm()函数中的观察值?
背景如下.我正在尝试为特定产品建立个人排名系统,比如手机.我可以建立基于价格的线性模型作为因变量和其他特征,如屏幕尺寸,内存,操作系统等作为自变量.然后,我可以用它来预测手机的实际成本(与宣布的价格相反),从而找到最佳的价格/良好系数.这就是我已经做过的事情.
现在我想"突出"一些对我来说很重要的功能.例如,我可能需要一个具有大内存的手机,因此我想给它更高的权重,以便线性模型针对内存变量进行优化.
lm()R中的函数有weights参数,但这些是观察的权重而不是变量(如果这是错误的,请纠正我).我也试着玩配方,但只有翻译错误.有没有办法将变量的权重合并在一起lm()?
当然,lm()功能不是唯一的选择.如果您知道如何使用其他类似的解决方案(例如glm()),这也很好.
UPD.经过几次评论后,我明白了我对这个问题的思考方式是错误的.通过调用获得的线性模型lm()给出了训练样例的最佳系数,并且没有办法(也没有必要)改变变量的权重,对不起我所做的混乱.我实际上正在寻找的是改变现有线性模型中系数的方法,以手动使一些参数比其他参数更重要.继续前面的例子,假设我们有以下价格公式:
price = 300 + 30 * memory + 56 * screen_size + 12 * os_android + 9 * os_win8
Run Code Online (Sandbox Code Playgroud)
该公式描述了价格和电话参数之间依赖关系的最佳可能线性模型.但是,现在我想手动将memory变量前面的数字30 改为60,所以它变为:
price = 300 + 60 * memory + 56 * screen_size + 12 * os_android + 9 * os_win8
Run Code Online (Sandbox Code Playgroud)
当然,这个公式不再反映价格和手机参数之间的最佳关系.同时因变量并不显示实际价格,只是一些良好的价值,考虑到记忆对我来说比一般人重要两倍(基于第一个公式的系数).但是这种善良的价值(或者更确切地说,分数的价值goodness/price)正是我所需要的 - 有了这个我能找到最好的(在我看来)最好的价格手机.
希望所有这一切都有道理.现在我有一个(可能非常简单)的问题.我怎样才能手动设置在现有的线性模型系数,用获得的lm()?也就是说,我正在寻找类似的东西:
coef(model)[2] <- …Run Code Online (Sandbox Code Playgroud) 我想用python计算多元线性回归.我发现这个代码用于简单的线性回归
import numpy as np
from matplotlib.pyplot import *
x = np.array([1, 2, 3, 4, 5])
y = np.array([2, 3, 4, 4, 5])
n = np.max(x.shape)
X = np.vstack([np.ones(n), x]).T
a = np.linalg.lstsq(X, y)[0]
Run Code Online (Sandbox Code Playgroud)
所以,a是系数,但我看不出是什么[0]意思?
如何更改代码以获得多个线性回归?
我有3D堆栈的蒙版数组.我想对每一行的值进行线性回归,col(空间索引)沿轴0(时间).这些堆叠的尺寸各不相同,但典型的形状可能是(50,2000,2000).我的空间有限但时间密集的测试用例具有以下几个方面:
stack.ma_stack.shape
Run Code Online (Sandbox Code Playgroud)
(1461,390,327)
我做了一个快速测试循环每一行,col:
from scipy.stats.mstats import linregress
#Ordinal dates
x = stack.date_list_o
#Note: idx should be row, col
def sample_lstsq(idx):
b = stack.ma_stack[:, idx[0], idx[1]]
#Note, this is masked stats version
slope, intercept, r_value, p_value, std_err = linregress(x, b)
return slope
out = np.zeros_like(stack.ma_stack[0])
for row in np.arange(stack.ma_stack.shape[1]):
for col in np.arange(stack.ma_stack.shape[2]):
out[row, col] = sample_lstsq((row, col))
Run Code Online (Sandbox Code Playgroud)
这很有效(慢慢地).我知道必须有一个更有效的方法.
我开始玩索引数组和np.vectorize,但我认为这实际上不会提供任何真正的改进.我考虑过把所有东西都扔给熊猫或试图移植到Cython,但我希望我能坚持使用NumPy/SciPy.或者并行解决方案是提高性能的最佳选择?
另外,有没有人对NumPy/SciPy线性回归选项进行基准测试?我遇到了以下选项,但没有测试过自己:
我希望有一种现有的方法可以提供显着的性能提升而不需要太多的实现工作.谢谢.
2013年12月3日编辑@ 02:29
@HYRY建议的方法对于上面描述的样本数据集(在所有维度(空间和时间)中)是连续的(未屏蔽的),完美地工作(约15秒运行时).但是,当将包含缺失数据的掩码数组传递给np.linalg.leastsq时,所有掩码值都会用fill_value(defualt 1E20)填充,这会导致伪线性拟合.
幸运的是,numpy蒙面数组模块有np.ma.polyfit(deg = 1),它可以处理像np.linalg.leastsq这样的2D y数组.看一下源代码(https://github.com/numpy/numpy/blob/v1.8.0/numpy/ma/extras.py#L1852),ma polyfit只是np.polyfit的一个包装器,它使用了一个组合掩码来自x和y面具.当y中缺失数据的位置不变时,这适用于2D y.
不幸的是,我的数据在空间和时间上有可变的丢失数据位置.这是另一个堆栈的示例:
In [146]: …Run Code Online (Sandbox Code Playgroud) 在我最近参加的一些机器学习课程中,我已经介绍了梯度下降以找到线性回归的最佳拟合线.
在一些统计课程中,我了解到我们可以使用统计分析来计算这一行,使用均值和标准差 - 本页详细介绍了这种方法.为什么这种看似更简单的技术没有用于机器学习?
我的问题是,梯度下降是拟合线性模型的首选方法吗?如果是这样,为什么?或者教授是否只是在更简单的设置中使用梯度下降来将该类引入技术?
我正在对数据框中的一些变量进行线性回归.我希望能够通过分类变量对线性回归进行子集化,对每个分类变量运行线性回归,然后将t-stats存储在数据框中.如果可能的话,我想在没有循环的情况下这样做.
这是我正在尝试做的一个示例:
a<- c("a","a","a","a","a",
"b","b","b","b","b",
"c","c","c","c","c")
b<- c(0.1,0.2,0.3,0.2,0.3,
0.1,0.2,0.3,0.2,0.3,
0.1,0.2,0.3,0.2,0.3)
c<- c(0.2,0.1,0.3,0.2,0.4,
0.2,0.5,0.2,0.1,0.2,
0.4,0.2,0.4,0.6,0.8)
cbind(a,b,c)
Run Code Online (Sandbox Code Playgroud)
我可以从运行以下线性回归开始,非常容易地拉出t统计量:
summary(lm(b~c))$coefficients[2,3]
Run Code Online (Sandbox Code Playgroud)
但是,我希望能够在列a为a,b或c时运行回归.我想将t-stats存储在一个如下所示的表中:
variable t-stat
a 0.9
b 2.4
c 1.1
Run Code Online (Sandbox Code Playgroud)
希望有道理.如果您有任何建议,请告诉我!
在测量拟合优度时,R平方似乎是“简单”线性模型的一种普遍理解(和接受)的度量。但是statsmodels(与其他统计软件一样)RLM不包含R平方和回归结果。是否有一种方法可以“手动”进行计算,也许类似于在Stata中进行的计算?
还是有其他方法可用于/由其产生的结果来计算sm.RLS?
这是Statsmodels产生的:
import numpy as np
import statsmodels.api as sm
# Sample Data with outliers
nsample = 50
x = np.linspace(0, 20, nsample)
x = sm.add_constant(x)
sig = 0.3
beta = [5, 0.5]
y_true = np.dot(x, beta)
y = y_true + sig * 1. * np.random.normal(size=nsample)
y[[39,41,43,45,48]] -= 5 # add some outliers (10% of nsample)
# Regression with Robust Linear Model
res = sm.RLM(y, x).fit()
print(res.summary())
Run Code Online (Sandbox Code Playgroud)
哪个输出:
Robust linear Model …Run Code Online (Sandbox Code Playgroud) 我想从OLS模型中找到样本外预测的标准偏差和置信区间.
此问题类似于模型预测的置信区间,但明确侧重于使用样本外数据.
这个想法是针对一个函数wls_prediction_std(lm, data_to_use_for_prediction=out_of_sample_df),它返回prstd, iv_l, iv_u样本数据帧之外的函数.
例如:
import pandas as pd
import random
import statsmodels.formula.api as smf
from statsmodels.sandbox.regression.predstd import wls_prediction_std
df = pd.DataFrame({"y":[x for x in range(10)],
"x1":[(x*5 + random.random() * 2) for x in range(10)],
"x2":[(x*2.1 + random.random()) for x in range(10)]})
out_of_sample_df = pd.DataFrame({"x1":[(x*3 + random.random() * 2) for x in range(10)],
"x2":[(x + random.random()) for x in range(10)]})
formula_string = "y ~ x1 + x2"
lm = smf.ols(formula=formula_string, data=df).fit()
# …Run Code Online (Sandbox Code Playgroud) python linear-regression confidence-interval standard-deviation statsmodels
我想使用Tensorflow构建一个多元线性回归模型.
数据集:波特兰房价
一个数据示例:2104,3,399900(前两个是功能,最后一个是房价;我们有47个示例)
代码如下:
import numpy as np
import tensorflow as tf
import matplotlib.pyplot as plt
# model parameters as external flags
flags = tf.app.flags
FLAGS = flags.FLAGS
flags.DEFINE_float('learning_rate', 1.0, 'Initial learning rate.')
flags.DEFINE_integer('max_steps', 100, 'Number of steps to run trainer.')
flags.DEFINE_integer('display_step', 100, 'Display logs per step.')
def run_training(train_X, train_Y):
X = tf.placeholder(tf.float32, [m, n])
Y = tf.placeholder(tf.float32, [m, 1])
# weights
W = tf.Variable(tf.zeros([n, 1], dtype=np.float32), name="weight")
b = tf.Variable(tf.zeros([1], dtype=np.float32), name="bias")
# linear model
activation = tf.add(tf.matmul(X, …Run Code Online (Sandbox Code Playgroud) 我是R和统计学的新手,并且无法弄清楚如何在运行多元线性回归后绘制预测值与实际值的关系.我遇到过类似的问题(只是无法理解代码).如果您解释一下代码,我将不胜感激.这是我到目前为止所做的:
# Attach file containing variables and responses
q <- read.csv("C:/Users/A/Documents/Design.csv")
attach(q)
# Run a linear regression
model <- lm(qo~P+P1+P4+I)
# Summary of linear regression results
summary(model)
Run Code Online (Sandbox Code Playgroud)
预测与实际的关系是如此,我可以用图形方式看出我的回归在我的实际数据中的适合程度.
python ×5
r ×4
numpy ×3
lm ×2
plot ×2
statsmodels ×2
power-law ×1
regression ×1
statistics ×1
tensorflow ×1