首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >R中图的二次方程项的求法

R中图的二次方程项的求法
EN

Stack Overflow用户
提问于 2010-11-04 22:46:32
回答 4查看 6.8K关注 0票数 2

我需要找到我在R中绘制的图形的二次方程项。当我在excel中这样做时,该项出现在图表上的文本框中,但我不确定如何将其移动到单元格中以供后续使用(以应用于需要校准的值),或者实际上如何在R中请求它。如果它在R中是可调用的,它是否可以作为对象保存以用于将来的计算?

这在R中看起来应该是一个简单的请求,但我找不到任何类似的问题。非常感谢任何人在这方面能提供的任何帮助。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2010-11-05 00:24:16

所有的答案都提供了你想要做的事情的方方面面,但到目前为止没有把所有的事情都放在一起。让我们考虑一下Tom Liptrot的答案示例:

代码语言:javascript
运行
复制
fit <- lm(speed ~ dist + I(dist^2), cars)

这给了我们一个拟合的线性模型,变量dist中有一个二次型。我们使用coef()提取器函数提取模型系数:

代码语言:javascript
运行
复制
> coef(fit)
 (Intercept)         dist    I(dist^2) 
 5.143960960  0.327454437 -0.001528367

所以你拟合的方程式(由于打印需要舍入)是:

\hat{速度}= 5.143960960 + (0.327454437 *距离)+ (-0.001528367 *距离^2)

(其中,hat{speed}是响应速度的拟合值)。

如果你想将这个拟合方程应用于某些数据,那么我们可以编写我们自己的函数来实现:

代码语言:javascript
运行
复制
myfun <- function(newdist, model) {
    coefs <- coef(model)
    res <- coefs[1] + (coefs[2] * newdist) + (coefs[3] * newdist^2)
    return(res)
}

我们可以像这样应用这个函数:

代码语言:javascript
运行
复制
> myfun(c(21,3,4,5,78,34,23,54), fit)
[1] 11.346494  6.112569  6.429325  6.743024 21.386822 14.510619 11.866907
[8] 18.369782

对于一些新的距离值(dist),这似乎是您从Q中想要做的。然而,在R中,我们通常不会做这样的事情,因为,为什么用户必须知道如何从R中可以拟合的所有不同类型的模型中形成拟合或预测值?

在R中,我们使用标准方法和提取器函数。在这种情况下,如果要将Excel显示的“方程”应用于所有数据,以获得此回归的拟合值,在R中,我们将使用fitted()函数:

代码语言:javascript
运行
复制
> fitted(fit)
        1         2         3         4         5         6         7         8 
 5.792756  8.265669  6.429325 11.608229  9.991970  8.265669 10.542950 12.624600 
        9        10        11        12        13        14        15        16 
14.510619 10.268988 13.114445  9.428763 11.081703 12.122528 13.114445 12.624600 
       17        18        19        20        21        22        23        24 
14.510619 14.510619 16.972840 12.624600 14.951557 19.289106 21.558767 11.081703 
       25        26        27        28        29        30        31        32 
12.624600 18.369782 14.057455 15.796751 14.057455 15.796751 17.695765 16.201008 
       33        34        35        36        37        38        39        40 
18.688450 21.202650 21.865976 14.951557 16.972840 20.343693 14.057455 17.340416 
       41        42        43        44        45        46        47        48 
18.038887 18.688450 19.840853 20.098387 18.369782 20.576773 22.333670 22.378377 
       49        50 
22.430008 21.93513

如果您想要将模型方程应用于一些不用于拟合模型的新数据值,那么我们需要从模型中获得预测。这是使用predict()函数完成的。使用上面我在myfun中插入的距离,这是我们如何以一种更以R为中心的方式来实现的:

代码语言:javascript
运行
复制
> newDists <- data.frame(dist = c(21,3,4,5,78,34,23,54))
> newDists
  dist
1   21
2    3
3    4
4    5
5   78
6   34
7   23
8   54
> predict(fit, newdata = newDists)
        1         2         3         4         5         6         7         8 
11.346494  6.112569  6.429325  6.743024 21.386822 14.510619 11.866907 18.369782

首先,我们创建一个新的数据框,其中包含一个名为"dist"的组件,其中包含我们希望从模型中获得预测的新距离。重要的是要注意,我们在这个数据框架中包括了一个变量,该变量与我们创建拟合模型时使用的变量具有相同的名称。这个新的数据框必须包含用于拟合模型的所有变量,但在本例中,我们只有一个变量dist。还要注意的是,我们不需要包含任何关于dist^2的内容。R将为我们处理这些内容。

然后我们使用predict()函数,给它提供我们的拟合模型,并提供刚刚创建的新数据框架作为参数'newdata',给我们提供新的预测值,这些预测值与我们之前手工完成的值相匹配。

我忽略了一点,predict()fitted()实际上是一组完整的函数。有针对lm()模型、针对glm()模型等的版本。它们被称为泛型函数,具有针对几种不同类型对象的方法(如果您喜欢,可以使用不同版本)。您,即用户,通常只需要记住使用fitted()predict()等,而R则负责为您提供的拟合模型类型使用正确的方法。以下是base R中可用于fitted()泛型函数的一些方法:

代码语言:javascript
运行
复制
> methods(fitted)
[1] fitted.default*       fitted.isoreg*        fitted.nls*          
[4] fitted.smooth.spline*

   Non-visible functions are asterisked

根据您加载的其他包,您可能会得到更多。*只是意味着你不能直接引用这些函数,你必须使用fitted(),R会决定使用哪个函数。注意,lm()对象没有一个方法。这种类型的对象不需要特殊的方法,因此使用default方法是合适的。

票数 7
EN

Stack Overflow用户

发布于 2010-11-04 23:31:44

您可以在lm的forumla中添加一个二次项,以获得您想要的拟合。您需要在要平方的术语周围使用i(),如下例所示:

代码语言:javascript
运行
复制
plot(speed ~ dist, cars)

fit1 = lm(speed ~ dist, cars) #fits a linear model
abline(fit1) #puts line on plot
fit2 = lm(speed ~ I(dist^2) + dist, cars) #fits a model with a quadratic term
fit2line = predict(fit2, data.frame(dist = -10:130))
lines(-10:130 ,fit2line, col=2) #puts line on plot

要从该使用中获取系数,请执行以下操作:

代码语言:javascript
运行
复制
coef(fit2)
票数 5
EN

Stack Overflow用户

发布于 2010-11-04 23:51:02

我认为这在Excel中是不可能的,因为它们只提供了获得线性回归系数(SLOPEINTERCEPTLINEST)或指数回归系数(GROWTHLOGEST)的函数,尽管使用Visual Basic可能会更幸运。

对于R,您可以使用coef函数提取模型系数:

代码语言:javascript
运行
复制
mdl <- lm(y ~ poly(x,2,raw=T))
coef(mdl) # all coefficients
coef(mdl)[3] # only the 2nd order coefficient
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4097831

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档