如果我有一个条件公式:
时间< theta:y = x ^ 2
时间=> theta:y = x
如何在R中使用as.formula函数来构建类似的东西? (我也需要在它上面使用nls函数)。
我试过了:
Data2 <-as.formula(y ~ (x<=theta)*x^2 + (x>theta)*x)
但它没有用。
答案 0 :(得分:5)
我认为您不能使用nls
来拟合不可区分的函数。
您可以使用optimize
作为此具体示例:
#some example data
set.seed(42)
x <- runif(100, 0, 100)
y <- x
y[x <= 50] <- x[x <= 50]^2
y <- y + rnorm(100, sd = 0.01)
fun <- function(x, theta) {
#logical values are coerced to 0/1 automatically in calculations
x * (x > theta) + x^2 * (x <= theta)
}
SSE <- function(theta) {
sum((y - fun(x, theta))^2)
}
print(fit <- optimize(SSE, c(0, 100)))
#$minimum
#[1] 48.40996
#
#$objective
#[1] 0.008573424
plot(x, y)
lines(0:100, fun(0:100, fit$minimum))
答案 1 :(得分:1)
这可能就是你要找的东西。
Myfunction <- function(time, x, theta) {
if(time < theta) return(x^2)
else return(x)
}
请注意,公式是一个非常不同的对象,通常用于向函数提供统计模型。有关这些对象类型的详细信息,请参阅?function
和?formula
。
此功能的矢量化版本:
Myfunction <- function(time, x, theta) {
return((time < theta)*x^2 + (time >= theta)*x)
}