2

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

这似乎应该是 R 中的一个简单请求,但我找不到任何类似的问题。非常感谢任何人都可以为此提供的任何帮助。

4

4 回答 4

7

所有答案都提供了您想要做的事情的各个方面,但到目前为止还没有将它们结合在一起。让我们考虑一下 Tom Liptrot 的答案示例:

fit <- lm(speed ~ dist + I(dist^2), cars)

这为我们提供了一个拟合线性模型,其中变量 为二次方distcoef()我们使用提取函数提取模型系数:

> coef(fit)
 (Intercept)         dist    I(dist^2) 
 5.143960960  0.327454437 -0.001528367

所以你的拟合方程(由于印刷而四舍五入):

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

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

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

myfun <- function(newdist, model) {
    coefs <- coef(model)
    res <- coefs[1] + (coefs[2] * newdist) + (coefs[3] * newdist^2)
    return(res)
}

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

> 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对于一些新的距离值(可以在 R 中拟合的所有不同类型模型的预测值?

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

> 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 为中心的方式进行操作:

> 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()orpredict()等​​,而 R 负责为您提供的拟合模型类型使用正确的方法。以下是基本 R 中可用于fitted()泛型函数的一些方法:

> methods(fitted)
[1] fitted.default*       fitted.isoreg*        fitted.nls*          
[4] fitted.smooth.spline*

   Non-visible functions are asterisked

根据您加载的其他软件包,您可能会得到更多。*只是意味着您不能直接引用这些函数,您必须使用fitted()并且 R 计算出要使用的那些函数。请注意,没有lm()对象的方法。这种类型的对象不需要特殊的方法,因此该default方法将被使用并且是合适的。

于 2010-11-04T16:24:16.227 回答
5

您可以在 lm 的论坛中添加一个二次项以获得您所追求的适合度。您需要在要平方的术语周围使用 I(),如下例所示:

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

要从此使用中获取系数:

coef(fit2)
于 2010-11-04T15:31:43.727 回答
1

我认为这在 Excel 中是不可能的,因为它们只提供函数来获取线性回归 ( , ) 或指数回归 ( , ) 的系数SLOPE,尽管INTERCEPT使用Visual Basic 可能会有更多的运气。LINESTGROWTHLOGEST

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

mdl <- lm(y ~ poly(x,2,raw=T))
coef(mdl) # all coefficients
coef(mdl)[3] # only the 2nd order coefficient
于 2010-11-04T15:51:02.133 回答
0

我猜您的意思是您在 Excel 或 R 中绘制 X 与 Y 值,并在 Excel 中使用“添加趋势线”功能。在 R 中,您可以使用该lm函数将线性函数拟合到您的数据中,这也为您提供了“r 平方”术语(请参阅链接页面中的示例)。

于 2010-11-04T14:56:26.567 回答