2010-11-04 4 views
2

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

Кажется, что это должен быть простой запрос в R, но я не могу найти подобных вопросов. Большое спасибо заранее за любую помощь, которую любой может предоставить по этому поводу.

ответ

6

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

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

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

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

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

\ шляпого {скорости} = 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 будет использоваться и подходит.

+0

Похоже, это может сработать для меня ... но я признаю, что я немного смущен, хотя вы написали его так кратко и профессионально. Извините, мне интересно, могу ли я объяснить, что я хочу квадратичное уравнение из пары значений, которые содержат несколько стандартных концентраций раствора и их соответствующие показания для предварительной калибровки. Затем я хотел бы применить этот квадратичный термин к показаниям мутности, принятым в течение месяца. Я предполагаю, что с течением времени мне придется брать линейный дрейф. – Joey

+0

Благодарим вас за простой пример 'установлены' и' предсказывать'. Вы только что спасли мне часы работы! – 2011-10-10 18:52:21

0

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

+0

Спасибо за это, хотя я не уверен, что хочу линейную функцию для кривой ... Я ищу квадратичный член: ax^2 + bx + c = y. Это тот, который появляется на диаграмме, если я делаю это в excel, но я не знаю, как запросить его в R ..? :) – Joey

5

Вы можете добавить квадратный член в forumla в 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

Мне также нравится «кривая» вместо комбинации «предсказывать» и «строки», например, «кривая» (коэффициенты fit2 $ [1] + fit2 $ [3] * x + fit2 $ коэффициенты [2] * x^2, add = T) '. – hplieninger

1

Я не думаю, что это возможно в 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

Это, безусловно, работает для линейной модели и повышает крутизну или градиент, а также значение перехвата. Однако это не коэффициенты для квадратичного уравнения ...? – Joey

+0

Эта модель использует полиномы Лежандра, поэтому коэффициенты не будут соответствовать ожидаемым. – hadley

+0

@Joey Вы имеете в виду для случая Excel? Я думал, что написал так, чтобы было ясно, что это невозможно, но я отредактирую его, чтобы сделать его более ясным. – James