Ошибка функции plot() при построении диаграмм lm()

Вопросы по статистическому пакету R. Не обязательно гео.
Ответить
womak
Участник
Сообщения: 73
Зарегистрирован: 13 окт 2006, 06:19
Репутация: 0

Ошибка функции plot() при построении диаграмм lm()

Сообщение womak » 08 фев 2016, 02:15

Доброго времени суток!
Пытаюсь получить уравнение множественной регрессии. Использую книгу-учебник Р.И.Кабакова "R в действии. Анализ и визуализация данных в программе R", последовательно выполняю примеры из главы 8. Дошел до построения диагностических диаграмм (глава 8.3.1), применяю функцию plot()
Текст ПрограммыShow

Код: Выделить всё

> library(car)
> setwd("D:/data/R Project/M")
> x <- read.table('_M_.dat', sep=' ', header= TRUE)
> summary(x)   
      long            lat              M               X2_2         
 Min.   :136.8   Min.   :36.67   Min.   :-38.24   Min.   :-13.4225  
 1st Qu.:147.3   1st Qu.:44.89   1st Qu.:-26.09   1st Qu.: -6.4841  
 Median :149.5   Median :47.67   Median :-22.77   Median : -4.3408  
 Mean   :150.2   Mean   :48.05   Mean   :-21.41   Mean   : -4.5497  
 3rd Qu.:152.9   3rd Qu.:51.01   3rd Qu.:-15.81   3rd Qu.: -2.6442  
 Max.   :164.9   Max.   :59.49   Max.   : 15.00   Max.   :  0.2172  
      X3_1               N               X1                 X2         
 Min.   :-9.3983   Min.   :  1.0   Min.   :-282.387   Min.   :-1.6837  
 1st Qu.:-3.8409   1st Qu.: 80.5   1st Qu.:  -6.557   1st Qu.: 0.7391  
 Median :-1.6686   Median :160.0   Median :  12.905   Median : 1.6464  
 Mean   :-2.5937   Mean   :160.0   Mean   :  13.621   Mean   : 1.9559  
 3rd Qu.:-0.8717   3rd Qu.:239.5   3rd Qu.:  37.842   3rd Qu.: 2.7114  
 Max.   : 0.5194   Max.   :319.0   Max.   : 240.795   Max.   : 8.2283  
       X3               X2_1               X4        
 Min.   :-9115.2   Min.   :-0.5961   Min.   : 12.16  
1st Qu.:-4655.8   1st Qu.: 0.5199   1st Qu.: 50.02 
 Median :-1287.5   Median : 1.3203   Median : 65.23  
 Mean   :-2382.7   Mean   : 1.9593   Mean   : 73.52  
 3rd Qu.: -458.2   3rd Qu.: 3.0517   3rd Qu.: 80.89  
 Max.   :  493.9   Max.   : 7.3753   Max.   :654.58  
> fit <- lm(I(-1*M) ~ X1 + X2 + I(X3/-1000) + X4, data=x)
> summary(fit)

Call:
lm(formula = I(-1 * M) ~ X1 + X2 + I(X3/-1000) + X4, data = x)

Residuals:
     Min       1Q   Median       3Q      Max 
-25.8916  -2.9421  -0.2681   2.2475  13.8906 

Coefficients:
             Estimate Std. Error t value Pr(>|t|)    
(Intercept) 31.346898   0.799152  39.225  < 2e-16 ***
X1          -0.041058   0.004324  -9.495  < 2e-16 ***
X2          -0.817607   0.170710  -4.789 2.58e-06 ***
I(X3/-1000) -3.040876   0.168223 -18.076  < 2e-16 ***
X4          -0.007242   0.005491  -1.319    0.188    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 5 on 314 degrees of freedom
Multiple R-squared:  0.5185,    Adjusted R-squared:  0.5123 
F-statistic: 84.52 on 4 and 314 DF,  p-value: < 2.2e-16

> confint(fit)
                  2.5 %       97.5 %
(Intercept) 29.77452766 32.919268162
X1          -0.04956610 -0.032549826
X2          -1.15348683 -0.481726516
I(X3/-1000) -3.37186279 -2.709889603
X4          -0.01804681  0.003562752
> plot(fit)
Ожидаю подтверждения смены страницы...
Ожидаю подтверждения смены страницы...
Ошибка: $ operator is invalid for atomic vectors
Как я понял, при построении диаграммы "линейность" возникает следующая ошибка: $ operator is invalid for atomic vectors.
Хотелось бы узнать в чем причина и как исправить.

womak
Участник
Сообщения: 73
Зарегистрирован: 13 окт 2006, 06:19
Репутация: 0

Re: Ошибка функции plot() при построении диаграмм lm()

Сообщение womak » 08 фев 2016, 06:30

Заменил в формуле
fit <- lm(I(-1*M) ~ X1 + X2 + I(X3/-1000) + X4, data=x)
на
fit <- lm(I(abs(M)) ~ X1 + X2 + I(X3/-1000) + X4, data=x)
и проблема пропала

gamm
Гуру
Сообщения: 2677
Зарегистрирован: 15 окт 2010, 08:33
Репутация: 592
Ваше звание: программист
Откуда: Казань

Re: Ошибка функции plot() при построении диаграмм lm()

Сообщение gamm » 08 фев 2016, 08:20

womak писал(а):Хотелось бы узнать в чем причина и как исправить.
причина в очень плохом стиле написания программы, в данном случае - в использовании I(). Исправить просто - вычисления преобразованных переменных должны делаться вне модели, и сохраняться в таблице (если не хотите портить исходную - во временной). А в формуле модели должны быть только переменные, а не выражения, иначе будут проблемы (и не только с выводом графиков). Да, и проблема не пропала ...

womak
Участник
Сообщения: 73
Зарегистрирован: 13 окт 2006, 06:19
Репутация: 0

Re: Ошибка функции plot() при построении диаграмм lm()

Сообщение womak » 09 фев 2016, 04:48

Спасибо, gamm, за разъяснения.
Я добавил в код следующий фрагмент:

Код: Выделить всё

y <- data.frame(abs(x$M),x$X1,x$X2,x$X3/-1000,x$X4)
names(y)[1:5] <- c("M", "X1", "X2", "X3", "X4")
summary(y)

gamm
Гуру
Сообщения: 2677
Зарегистрирован: 15 окт 2010, 08:33
Репутация: 592
Ваше звание: программист
Откуда: Казань

Re: Ошибка функции plot() при построении диаграмм lm()

Сообщение gamm » 09 фев 2016, 15:20

лучше сразу именовать:

Код: Выделить всё

tmp <- data.frame(M=abs(x$M), X1=x$X1, X2= x$X2, X3=x$X3/-1000, X4=x$X4)

womak
Участник
Сообщения: 73
Зарегистрирован: 13 окт 2006, 06:19
Репутация: 0

Re: Ошибка функции plot() при построении диаграмм lm()

Сообщение womak » 11 фев 2016, 07:28

Спасибо, gamm, а как можно также изящно поименовать строки в таблице, используя порядковые номера из колонки "N" таблицы х? Дело в том, что далее я намерен разбить генеральную выборку на подвыборки, попадающие в те или иные географические области, чтобы потом уже для них рассчитать регрессионную зависимость, при анализе которой точки (выбросы, напряженные значения, влиятельные значения) подписываются порядковыми номерами, а они будут различными для генеральной выборки и для частных. Если изначально использовать название строки (наблюдения) генеральной выборки, то анализировать и сопоставлять будет легче.

Иван Стрельников
Интересующийся
Сообщения: 40
Зарегистрирован: 11 авг 2011, 13:23
Репутация: 15

Re: Ошибка функции plot() при построении диаграмм lm()

Сообщение Иван Стрельников » 11 фев 2016, 18:42

Не совсем понял зачем изменять имена рядов если уже есть колонка содержащая ID.
На всякий случай, у класса data.frame есть два атрибута: names и row.names, которые можно изменять по своему усмотрению.

Например:

Код: Выделить всё

set.seed(22222)
df <- data.frame(Col1=rnorm(3), Col2=rnorm(3))
> attributes(df)
$names
[1] "Col1" "Col2"

$row.names
[1] 1 2 3

$class
[1] "data.frame"

# Изменим эти атрибуты:
names(df) <- c("Column_1", "Column_2") # Имена колонок
row.names(df) <- letters[1:3]	# Имена рядов !!! должны быть уникальными

>df
    Column_1    Column_1
a -0.4408494 -1.27108348
b  1.8870381 -0.01392890
c -1.2339827 -0.06256098

gamm
Гуру
Сообщения: 2677
Зарегистрирован: 15 окт 2010, 08:33
Репутация: 592
Ваше звание: программист
Откуда: Казань

Re: Ошибка функции plot() при построении диаграмм lm()

Сообщение gamm » 11 фев 2016, 19:58

womak писал(а):Спасибо, gamm, а как можно также изящно поименовать строки в таблице, используя порядковые номера из колонки "N" таблицы х?

Код: Выделить всё

tmp<-data.frame(N=1:15,x=rnorm(15))
ind<-sample(1:nrow(tmp),7)
set1.ind<-rep(FALSE,nrow(tmp))
set1.ind[ind]<-TRUE
set2.ind<-!set1.ind
rownames(tmp)[set1.ind]<-paste("set1",tmp$N[set1.ind],sep=".")
rownames(tmp)[set2.ind]<-paste("set2",tmp$N[set2.ind],sep=".")
tmp
         N          x
set2.1   1  0.4092877
set1.2   2 -0.7418290
set2.3   3  0.5975848
set2.4   4 -0.7641217
set2.5   5  1.1809408
set1.6   6  1.1658237
set2.7   7  2.0867663
set2.8   8  0.3613983
set1.9   9 -1.4694777
set1.10 10 -0.7732004
set2.11 11  0.5707453
set1.12 12  2.1027623
set1.13 13 -1.4525256
set2.14 14 -1.2250727
set1.15 15 -1.2825719

womak
Участник
Сообщения: 73
Зарегистрирован: 13 окт 2006, 06:19
Репутация: 0

Re: Ошибка функции plot() при построении диаграмм lm()

Сообщение womak » 12 фев 2016, 05:52

Иван Стрельников писал(а):Не совсем понял зачем изменять имена рядов если уже есть колонка содержащая ID.
...
В ходе обсуждения этой темы, я понял, что предпочтительнее если в функции lm использовать переменные, а не выражения. Поэтому я создал из оригинального файла таблицу интересующих меня переменных. Пока я работал со всеми данными, номера наблюдений соответствовали порядковому номеру. Когда я стал работать с выборками, мне понадобилось обозначить имена переменных так, как чтобы они соответствовали порядковому номеру в исходной выборке.

Gamm, Иван Стрельников, спасибо за помощь. Вопросы еще остались, но они уже далеки от темы "Ошибка функции plot()...."

gamm
Гуру
Сообщения: 2677
Зарегистрирован: 15 окт 2010, 08:33
Репутация: 592
Ваше звание: программист
Откуда: Казань

Re: Ошибка функции plot() при построении диаграмм lm()

Сообщение gamm » 13 фев 2016, 05:03

womak писал(а):Вопросы еще остались, но они уже далеки от темы "Ошибка функции plot()...."
так и заводите новые темы с новыми названиями ...

Аватара пользователя
Максим Дубинин
MindingMyOwnBusiness
Сообщения: 8984
Зарегистрирован: 06 окт 2003, 20:20
Статьи: 231
Проекты: 12/6
Репутация: 697
Ваше звание: NextGIS
Откуда: Москва
Контактная информация:

Re: Ошибка функции plot() при построении диаграмм lm()

Сообщение Максим Дубинин » 06 фев 2018, 16:21

PDF удален по требованию правообладателей
http://m-d.me/img/ss/20180206-sb6-229kb.jpg
пристегивайтесь, турбулентность прямо по курсу

Ответить

Вернуться в «R»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 2 гостя