Получить член квадратного уравнения графика в R

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

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


person Joey    schedule 04.11.2010    source источник


Ответы (4)


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

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 * расстояние) + (-0,001528367 * расстояние ^ 2)

(где \hat{скорость} - подогнанные значения отклика, скорость).

Если вы хотите применить это подогнанное уравнение к некоторым данным, мы можем написать нашу собственную функцию для этого:

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 будет использоваться и подходит.

person Gavin Simpson    schedule 04.11.2010
comment
Похоже, это может сработать для меня ... но я признаю, что немного сбит с толку, хотя вы написали это так кратко и профессионально. Извините, мне интересно, если я объясню, что мне нужно квадратное уравнение из пары значений, которые включают несколько стандартных концентраций раствора и их соответствующие показания предварительной калибровки. Затем я хотел бы применить этот квадратичный член к показаниям мутности, полученным в течение месяца. Я предполагаю, что со временем мне придется принять линейный дрейф. - person Joey; 05.11.2010
comment
Спасибо за простой пример fitted и predict. Вы только что сэкономили мне часы работы! - person ; 10.10.2011

Вы можете добавить квадратичный член на форуме в 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)
person Tom Liptrot    schedule 04.11.2010
comment
Мне также нравится curve вместо комбинации predict и lines, например, curve(fit2$coefficients[1] + fit2$coefficients[3]*x + fit2$coefficients[2]*x^2, add=T). - person hplieninger; 26.09.2013

Я не думаю, что это возможно в 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
person James    schedule 04.11.2010
comment
Это, безусловно, работает для линейной модели и обеспечивает наклон или градиент, а также значение точки пересечения. Однако это не коэффициенты квадратного уравнения...? - person Joey; 04.11.2010
comment
В этой модели используются полиномы Лежандра, поэтому коэффициенты не будут соответствовать вашим ожиданиям. - person hadley; 04.11.2010
comment
@Joey Вы имеете в виду случай с Excel? Я думал, что написал таким образом, чтобы было понятно, что это невозможно сделать, но я отредактирую, чтобы было понятнее. - person James; 04.11.2010
comment
@hadley Спасибо, я этого не знал, отредактирую, чтобы использовать параметр raw. - person James; 04.11.2010

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

person Michael Kuhn    schedule 04.11.2010
comment
Спасибо за это, хотя я не уверен, что мне нужна линейная функция для кривой... Я ищу квадратичный член: ax^2 + bx + c = y. Это тот, который появляется на диаграмме, если я делаю это в Excel, но я не знаю, как запросить его в R..? :) - person Joey; 04.11.2010