Получить член квадратного уравнения графа в R - PullRequest
2 голосов
/ 04 ноября 2010

Мне нужно найти член квадратного уравнения для графика, который я построил в R. Когда я делаю это в Excel, термин появляется в текстовом поле на диаграмме, но я не уверен, как переместить это в ячейкупоследующее использование (для применения к значениям, требующим калибровки) или, действительно, как запросить его в R. Если оно суммируемо в R, можно ли его сохранить как объект для будущих вычислений с?быть простым запросом в R, но я не могу найти подобные вопросы.Заранее большое спасибо за любую помощь, которую кто-либо может оказать в этом.

Ответы [ 4 ]

7 голосов
/ 04 ноября 2010

Все ответы предоставляют аспекты того, что вы хотите сделать, но пока что не сводит все это вместе. Давайте рассмотрим пример ответа Тома Липтрота:

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

Это дает нам подобранную линейную модель с квадратичной переменной dist. Мы извлекаем коэффициенты модели с помощью функции экстрактора coef():

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

Итак, ваше уравнение (при условии округления из-за печати):

\ hat {speed} = 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). Это то, что вы хотите сделать из Q. Однако в R мы обычно не делаем такие вещи, потому что, почему пользователь должен это делать? знаете, как сформировать подогнанные или прогнозируемые значения из всех типов моделей, которые можно подогнать в 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() или predict() и т. Д., В то время как 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 будет использоваться и подходит.

5 голосов
/ 04 ноября 2010

Вы можете добавить квадратный термин на форум в 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)
1 голос
/ 04 ноября 2010

Я не думаю, что это возможно в Excel, так как они предоставляют функции только для получения коэффициентов для линейной регрессии (SLOPE, INTERCEPT, LINEST) или для экспоненциальной (GROWTH, LOGEST)), хотя вам, возможно, повезет больше с использованием Visual Basic.

Что касается R, вы можете извлечь коэффициенты модели с помощью функции coef:

mdl <- lm(y ~ poly(x,2,raw=T))
coef(mdl) # all coefficients
coef(mdl)[3] # only the 2nd order coefficient
0 голосов
/ 04 ноября 2010

Полагаю, вы имеете в виду, что вы строите значения X против Y в Excel или R, а в Excel используете функцию «Добавить линию тренда». В R вы можете использовать функцию lm для подгонки линейной функции к вашим данным, и это также дает вам термин «квадрат» (см. Примеры на связанной странице ).

...