【问题标题】:Trying to find regression & p-value for every row of a csv file in R试图为 R 中 csv 文件的每一行找到回归和 p 值
【发布时间】:2019-11-26 14:58:55
【问题描述】:

您好,我对 R 比较陌生,在尝试对每行进行线性回归时遇到了一些麻烦。

我不能附上实际的数据集,因为我不允许分享它,但这是基本大纲:

       Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec (...total 12 cols)              
Type 1
Type 2 
Type 3 
(... total 1680 rows)

The values are level of inventory for each type, numeric (no strings).

基本上我想做的是outlined here

(1) 以时间为自变量的线性回归

(2) ANOVA 检验时间系数是否具有统计显着性。

我想做的是对每一行(即每个“类型”)进行回归分析,将时间作为自变量,然后为每一行输出一个 p 值,该值将添加到新列中的行中.目的是使用 p 值来查看每种类型的库存是否存在趋势,而不必绘制 1680 种不同类型的产品,因为这很难分析。

我已经使用 lm() 对每一行查看了很多类似的问题,但没有一个问题包括我将如何输出 p 值而不是系数本身。希望有人能帮忙!

【问题讨论】:

  • 在交叉验证堆栈交换上发布可能会有更好的结果。
  • 可能最简单的方法是“融化”数据集(即转换为长格式),然后在 SO 上应用许多“按组线性回归”解决方案之一(例如nlme::lmList())
  • 你的 p 值是什么意思?在线性回归中,p 值用于确定变量是否对模型有贡献。不用于判断模型是否有趋势、是否准确、是否满足线性回归的所有假设、超过12个数据点是否有效等。
  • 另外,12 个数据点非常小。而且您实际上只有 1 个 [ordered] 变量,即月份。在时间序列分析中,您将能够判断是否存在斜率(趋势),但不是更多。您可能还可以判断数据是凸的还是凹的,或者其他类型的度量。但是,如果存在年度季节性,那么您将不会从 12 个月的线性回归中获得太多收益。
  • 我的意思是在这种情况下,回归被用来找到时间系数,我试图看看时间系数是否在统计上显着,作为是否存在趋势。就我的目的而言,我只需要找出 (a) 是否存在趋势,时间序列不是平稳的,或者 (b) 没有趋势,时间序列是平稳的。我希望确定的是任何停滞的库存。使用 p-value 或 adf.test 似乎最直观,因为我不能很好地拥有 1680 个不同的图表并以这种方式识别停滞类型。

标签: r linear-regression anova


【解决方案1】:

cmets 很有用,即在模型有效性方面,请参阅交叉验证。以下是我使用 data.table 包处理代码的方法:

# some fake value
input <- data.frame(type=1:3, x1=rnorm(3), x2=rnorm(3), x3=rnorm(3), x4=rnorm(3))

# package for data manipulating, run install.packages("data.table")
library(data.table)

# convert to data.table and set names based on time index
input_dt <- as.data.table(input)
setnames(input_dt, c("type", 1:(ncol(input_dt)-1)))
input_dt[]

# wide to long format for modelling
dt <- melt(input_dt, id.vars = "type", variable.name="time")
dt[, time := as.numeric(time)]

# function to fit lm and get p-value
# replace with yours
myPvalFun <- function(data){

  # model. Do value ~ -1 + time for no intercept model
  mod <- lm(value ~ time, data=data)

  # p-values for regressor
  pvals <- summary(mod)$coefficients[,4]

  # just time p-value, [1] is intercept
  return(pvals[2])
}

# loop across using lapply and splitting the data up
pvals_list <- lapply(unique(dt$type), function(i){
  mod_dt <- dt[type==i,]
  data.table(type=i, pval=myPvalFun(mod_dt))
})
# bind list to a data.table
pvals <- rbindlist(pvals_list)

# make output and convert to data.frame
output_dt <- merge(input_dt, pvals, by="type")
output <- as.data.frame(output_dt)

【讨论】:

  • 你能解释一下“输入
  • 这只是我的示例数据。它将被您的数据替换。我使用rnorm 制作了一些虚拟值,以便可以运行和评估代码
  • 啊,我明白了,所以在这种情况下,我假设我必须将我的 csv 转换为 data.frame 格式?
  • 谢谢!我会试试这段代码,让你知道,但看起来很可靠!
  • 实际上,我忘了提到我的前 3 列是关于每个“类型”的其他详细信息,它们是字符串,需要忽略。在进行回归时如何添加命令以忽略这些列?
猜你喜欢
  • 1970-01-01
  • 2015-10-12
  • 1970-01-01
  • 1970-01-01
  • 2011-08-01
  • 1970-01-01
  • 2015-09-07
相关资源
最近更新 更多