是否有一个R函数用于从字符串创建公式,例如;beta和x2B;贝塔*t";?

是否有一个R函数用于从字符串创建公式,例如;beta和x2B;贝塔*t";?,r,function,plot,line,R,Function,Plot,Line,我正在运行一个交叉验证算法,以找到最适合每天变化的数据的多项式。我想找到一种不麻烦的方法,在一个简单的绘图中显示拟合,而不必每次手动编写整个回归公式和绘图的beta系数。对于回归公式,解决起来很简单,我使用sprintf创建了一个字符串,并在字符串上使用as.formula() 问题是如何画出这条线。我用同样的方法创建了一个字符串,但是as.formula()函数似乎只适用于回归公式,而不适用于形式为“beta+beta*t”的公式。我还尝试使用eval(parse()),如下所示,但这只创建了

我正在运行一个交叉验证算法,以找到最适合每天变化的数据的多项式。我想找到一种不麻烦的方法,在一个简单的绘图中显示拟合,而不必每次手动编写整个回归公式和绘图的beta系数。对于回归公式,解决起来很简单,我使用sprintf创建了一个字符串,并在字符串上使用as.formula()

问题是如何画出这条线。我用同样的方法创建了一个字符串,但是as.formula()函数似乎只适用于回归公式,而不适用于形式为“beta+beta*t”的公式。我还尝试使用eval(parse()),如下所示,但这只创建了NA的向量

#Create strings
poly_form = "y ~ t"
beta_form = "beta[1]"
for (i in 1:pmin) {  #pmin is the best polynomial fit, e.g. 4 or 9.
           poly_form <- sprintf("%s + I(t^%s)", poly_form, i)
           beta_form <- sprintf("%s + beta[%s]*t^%s",beta_form, i+1, i)
            }

#Regression
poly.mod = lm(as.formula(poly_form))
beta = coef(poly.mod)

#Plot
plot(t, y, type = 'h')
lines(t, eval(parse(text = beta_form))) #This doesn't work.

你不是这样做的

首先,使用
poly
功能。第二,使用
预测

set.seed(42)
y <- rnorm(10)
t <- 1:10

DF <- data.frame(y, t) #important!

pmin <- 3

poly.mod <- lm(y ~ poly(t, degree = pmin, raw = TRUE), data = DF)

plot(t, y, type = 'h')
curve(predict(poly.mod, newdata = data.frame(t = x)), add = TRUE)
set.seed(42)

y我认为Roland的方法在这里更好,但是对于为什么您自己的代码不起作用,得到一个解释总是很好的

让我们用一些虚拟数据将其具体化,以便我们可以看到问题所在:

set.seed(69)
t 8.139958e+01-1.494928e+01 NA 1.037905e+00-3.454374e-02 6.267641e-04
#>I(t^5)I(t^6)
#>-5.534399e-06 1.904566e-08
这意味着当我们解析
beta_形式
时,总和中总会有一个
NA
,因此它只会产生一个
NA
的向量:

eval(parse(text = beta_form))
#>  [1] NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA
#> [28] NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA
#> [55] NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA
#> [82] NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA
那么解决办法是什么呢

只需将原来的
poly\u form=“y~t”
更改为
poly\u form=“y~”

现在,您可以按原样运行其余代码,并获得所需的结果:

plot(t,y,type='h')
行(t,eval(解析(text=beta_形式)))

使用
poly()


我建议使用惩罚平滑器而不是多项式(参见mgcv包)。
pmin <- 6
poly_form = "y ~ t"
beta_form = "beta[1]"
for (i in 1:pmin) {  #pmin is the best polynomial fit, e.g. 4 or 9.
           poly_form <- sprintf("%s + I(t^%s)", poly_form, i)
           beta_form <- sprintf("%s + beta[%s]*t^%s",beta_form, i+1, i)
            }
poly_form
#> [1] "y ~ t + I(t^1) + I(t^2) + I(t^3) + I(t^4) + I(t^5) + I(t^6)"
beta_form
# > [1] "beta[1] + beta[2]*t^1 + beta[3]*t^2 + beta[4]*t^3 + beta[5]*t^4 + 
         beta[6]*t^5 + beta[7]*t^6"
poly.mod = lm(as.formula(poly_form))
poly.mod

#> Call:
#> lm(formula = as.formula(poly_form))
#>
#> Coefficients:
#> (Intercept)            t       I(t^1)       I(t^2)       I(t^3)       I(t^4)  
#> -1.910e+00   -2.444e-01           NA   -4.095e-02    5.933e-03   -1.499e-04  
#>      I(t^5)       I(t^6)  
#>   1.611e-06   -5.903e-09  
eval(parse(text = beta_form))
#>  [1] NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA
#> [28] NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA
#> [55] NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA
#> [82] NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA
model = lm(y ~ poly(t, 4, raw = TRUE, data = df)
beta = coef(model)
t = t0 ^ (0:4)
sum(beta * t)    

# or
predict(model, newdata)   # dataframe of t