Как найти среднеквадратичную ошибку?

Я создал линейный набор данных и использовал lm(), чтобы подогнать модель к этому набору данных. Сейчас я пытаюсь найти MSE, используя mse()

Я знаю формулу для MSE, но я пытаюсь использовать эту функцию. Каким будет правильный способ сделать это? Я просмотрел документацию, но я либо тупой, либо это просто написано для людей, которые действительно знают, что они делают.

library(hydroGOF)

x.linear <- seq(0, 200, by=1) # x data
error.linear <- rnorm(n=length(x.linear), mean=0, sd=1) # Error (0, 1)
y.linear <- x.linear + error.linear  # y data

training.data <- data.frame(x.linear, y.linear)
training.model <- lm(training.data)
training.mse <- mse(training.model, training.data)

plot(training.data)

mse() нужны два фрейма данных. Я не знаю, как получить фрейм данных из lm(). Нахожусь ли я вообще на правильном пути к поиску подходящей MSE для своих данных?


person Dan    schedule 27.09.2016    source источник
comment
@ZheyuanLi Я более или менее спрашиваю, откуда может взяться мой прогнозируемый / смоделированный набор значений Y для формулы. В функции mse() требуется наблюдаемый и смоделированный кадр данных. Мне нужно знать, что использовать для обоих этих фреймов данных.   -  person Dan    schedule 27.09.2016
comment
Я не знаю, почему вы использовали эту странную функцию вместо mean(training.model$residuals ^ 2)   -  person Gregor Thomas    schedule 27.09.2016
comment
Вы можете получить соответствующие значения из модели training.model$fitted.values, но они являются вектором, а не фреймом данных. Поэтому я полагаю, что альтернативой является hydroGOF::mse(data.frame(training.model$fitted.values), training.data[["y.linear"]])... также я настоятельно рекомендую указывать формулу при подгонке модели. Поскольку у вас это есть, я думаю, что вы регрессируете x на y, что, вероятно, не то, чего вы хотите.   -  person Gregor Thomas    schedule 27.09.2016
comment
@ZheyuanLi Я думаю, что вы, ребята, правы, я просто сделаю это по старинке   -  person Dan    schedule 27.09.2016


Ответы (4)


Попробуй это:

mean((training.data - predict(training.model))^2)
#[1] 0.4467098
person Sandipan Dey    schedule 27.09.2016
comment
Мне посоветовали использовать функцию mse(), но мне так удобнее. Спасибо! - person Dan; 27.09.2016
comment
Необходимо соблюдать особую осторожность при расчете MSE для множественной линейной регрессии. Знаменатель для вычисления MSE равен n - (p+1), где p — количество предикторов. Здесь, в случае простой линейной регрессии, p = 1, поэтому знаменатель становится n. - person Quazi Irfan; 07.04.2020

Вы также можете использовать приведенный ниже код, который очень чист, чтобы получить среднеквадратичную ошибку.

install.packages("Metrics")
library(Metrics)
mse(actual, predicted)

Первый набор данных, для которого является актуальным: training.data Второй аргумент — это тот, который вы будете предсказывать следующим образом:

pd <- predict(training.model , training.data) mse(training.data$,pd)

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

person Vineet    schedule 15.08.2017

Вы можете использовать компонент residual из выходных данных модели lm, чтобы найти mse следующим образом:

mse = mean(training.model$residuals^2)
person Namrata Tolani    schedule 11.10.2017

Примечание. Если вы пришли из другой программы (например, SAS), они получают среднее значение, используя сумму и степени свободы остатка. Я рекомендую сделать то же самое, если вы хотите получить более точную оценку ошибки.

mse = sum(training.model$residuals^2)/training.model$df.residual

Я обнаружил это, пытаясь понять, почему mean(my_model$residuals^2) в R отличается от MSE в SAS.

person Carlos Mercado    schedule 29.01.2019