我正在尝试将Boxcar /矩形函数拟合到R中的数据集。我正在使用nls和描述不同宽度的单位脉冲的自定义函数。以下是我到目前为止的情况:
# Defines the unit pulse function
# The left side of the pulse is at x0, the right at x1
pulse <- function(x, x0, x1) {
if (x >= x0 & x <= x1) {
return (1)
} else {
return (0)
}
}
xdata <- 1:30
ydata <- c(sample(-1:1, 10, replace = TRUE), sample(10:15, 10, replace = TRUE), sample(-1:1, 10, replace = TRUE))
plot(xdata, ydata)
df <- data.frame(xdata, ydata)
fitfit <- nls(ydata ~ I(A * pulse(xdata, L, R) + B), df, start = list(L = 0, R = 1, B = 0, A = 10))
我无法理解我得到的错误:
qr中的错误(.swts * attr(rhs,&#34;渐变&#34;)): dims [product 4]与对象的长度不匹配[30] 另外:警告信息: 1:在if(x> = x0&amp; x&lt; = x1){: 条件的长度> 1,只使用第一个元素 2:在if(x> = x0&amp; x&lt; = x1){: 条件的长度> 1,只使用第一个元素 3:在if(x> = x0&amp; x&lt; = x1){: 条件的长度> 1,只使用第一个元素 4:在if(x> = x0&amp; x&lt; = x1){: 条件的长度> 1,只使用第一个元素 5:在if(x> = x0&amp; x&lt; = x1){: 条件的长度> 1,只使用第一个元素 6:在if(x> = x0&amp; x&lt; = x1){: 条件的长度> 1,只使用第一个元素 7:在.swts * attr(rhs,&#34;渐变&#34;): 较长的物体长度不是较短物体长度的倍数
答案 0 :(得分:0)
你的脉冲函数不会返回一个向量,试试这个:
pulse <- function(x, x0, x1) {
ifelse (x >= x0 & x <= x1,1,0)
}
答案 1 :(得分:0)
非平滑功能可能会导致问题。在脉冲的两个边界上尝试蛮力并优化线性参数。请注意,下面我们添加了set.seed
以使ydata
可重现。
library(nls2)
set.seed(123)
xdata <- 1:30
ydata <- c(sample(-1:1, 10, replace = TRUE), sample(10:15, 10, replace = TRUE),
sample(-1:1, 10, replace = TRUE))
df <- data.frame(xdata, ydata)
pulse <- function(x, x0, x1) (x >= x0 & x <= x1) + 0
st <- subset(expand.grid(L = xdata, R = xdata), L < R)
nls2(ydata ~ cbind(pulse(xdata, L, R), 1), df, start = st, alg = "plinear-brute")
提供一些您可以忽略的错误消息,最后输出.lin1
和.lin2
与问题中的A
和B
对应的输出:
Nonlinear regression model
model: ydata ~ cbind(pulse(xdata, L, R), 1)
data: df
L R .lin1 .lin2
11.0 20.0 12.4 0.2
residual sum-of-squares: 49.6
Number of iterations to convergence: 435
Achieved convergence tolerance: NA