拟合数据集中的对数曲线

时间:2016-07-20 20:56:13

标签: r regression linear-regression lm

我有一个数据集archivo,其中包含自2003年以来每次政府拍卖期间的债券利率。前几行是:

     Fecha  1  2  3  4  5       6  7  8       9 10 11 12 18 24
2003-01-02 NA NA NA NA NA 44.9999 NA NA 52.0002 NA NA NA NA NA
2003-01-03 NA NA NA NA NA      NA NA NA      NA NA NA NA NA NA
2003-01-06 NA NA NA NA NA      NA NA NA      NA NA NA NA NA NA
2003-01-07 NA NA NA NA NA 40.0000 NA NA 45.9900 NA NA NA NA NA
2003-01-08 NA NA NA NA NA      NA NA NA      NA NA NA NA NA NA
2003-01-09 NA NA NA NA NA 37.0000 NA NA 41.9999 NA NA NA NA NA

每个名为1到24的列对应不同的持续时间。 (1个月,2个月,......,24个月)。并非所有持续时间都在拍卖日期出售。这就是我NA的原因。

我需要使用具有至少多于1个值的每一行的对数拟合曲线计算NA s(缺失)率。对于具有所有NA s的行,我只能使用前面构造的曲线。

我知道我可以运行如下代码:

x<-colnames(archivo[,-1]) # to keep the durations
y<-t(archivo[1,-1])
estimacion<-lm(y ~ log(x))
param<-estimacion$coefficients

并获取第一行的系数。然后运行循环并为每一行执行此操作。

有没有办法直接使用整个数据集并获取每一行的参数(每个日志拟合)而不进行循环?

希望问题很清楚。

提前致谢!

1 个答案:

答案 0 :(得分:1)

尝试:

dat <- as.data.frame(t(archivo[,-1]))  ## transpose you data frame

## a function to fit a model `y ~ log(x)` for response vector `y`
fit_model <- function (y) {
  non_NA <- which(!is.na(y))  ## non-NA rows index
  if (length(non_NA) > 1) {
    ## there are at least 2 data points, a linear model is possible
    lm.fit(cbind(1, log(non_NA)), y[non_NA])$coef
    } else {
    ## not sufficient number of data, return c(NA, NA)
    c(NA, NA)
    }
  }

## fit linear model column-by-column
result <- sapply(dat, FUN = fit_model)

请注意,我正在使用lm.fit()lm()调用的内核拟合例程。如果您不熟悉,请阅读?lm.fit。它需要两个基本论点:

  • 第一个是模型矩阵。模型y ~ log(x)的模型矩阵为matrix(c(rep(1,24), log(1:24)), ncol = 2)。您也可以通过model.matrix(~log(x), data = data.frame(x = 1:24))
  • 构建它
  • 第二个是响应向量。对于您的问题,它是一列dat

与可以处理lm()的{​​{1}}不同,NA不能。所以我们需要自己从模型矩阵和响应向量中删除lm.fit()行。 NA变量正在执行此操作。请注意,您的模型non_NA涉及2个参数/系数,因此拟合至少需要2个数据。如果数据不足,则无法进行模型拟合,我们返回y ~ log(x)

最后,我使用c(NA, NA)逐列拟合线性模型,仅保留系数sapply()

<强>测试

我正在使用您在问题中发布的示例行。使用上面的代码,我得到:

$coef

每列为# V1 V2 V3 V4 V5 V6 # x1 14.06542 NA NA 13.53005 NA 14.90533 # x2 17.26486 NA NA 14.77316 NA 12.33127 的每列(或dat的每一行)提供系数。

<强>更新

最初我在archivo中使用matrix(rep(1,24), log(1:24))[non_NA, ]作为模型矩阵。但这并不高效。它首先生成完整的模型矩阵,然后使用lm.fit()删除行。双重思想表明这更好:NA