我有一个数据集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
并获取第一行的系数。然后运行循环并为每一行执行此操作。
有没有办法直接使用整个数据集并获取每一行的参数(每个日志拟合)而不进行循环?
希望问题很清楚。
提前致谢!
答案 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
。