R: Ошибка в модели линейной регрессии

#r #regression

#r #регрессия

Вопрос:

У меня есть 2 разных фрейма данных, для которых я хотел бы выполнить линейную регрессию

Я написал для этого следующий код

 mydir<- "/media/dev/Daten/Task1/subject1/t1"
#multiple subject paths should be given here
# read full paths
myfiles<- list.files(mydir,pattern = "regional_vol*",full.names=T)
# initialise the dataframe from first file 

df<- read.table( myfiles[1], header = F,row.names = NULL, skip = 3, nrows = 1,sep = "t") 
# [-c(1:3),]
df
#read all the other files and update dataframe
#we read 4 lines to read the header correctly, then remove 3 
ans<- lapply(myfiles[-1], function(x){  read.table( x, header = F, skip = 3, nrows = 1,sep = "t")       })
ans
#update dataframe
#[-c(1:3),]
lapply(ans, function(x){df<<-rbind(df,x)}  )
#this should be the required dataframe

uncorrect<- array(df)

# Linear regression of ICV extracted from global size FSL 
# Location where your icv is located
ICVdir <- "/media/dev/Daten/Task1/T1_Images"
#loding csv file from ICV
mycsv  <- list.files(ICVdir,pattern = "*.csv",full.names = T )
af<- read.csv(file = mycsv,header = TRUE)
ICV<- as.data.frame(af[,2],drop=FALSE)
#af[1,]
#we take into consideration second column  of csv
#finalcsv <-lapply(mycsv[-1],fudnction(x){read.csv(file="global_size_FSL")})
subj1<- as.data.frame(rep(0.824,each=304))

plot(df ~ subj1, data = df,
       xlab = "ICV value of each subject",
       ylab = "Original uncorrected volume",
       main="intercept calculation"
       )

fit <- lm(subj1 ~ df )
  

Фрейм данных df содержит 304 значения в следующем формате

 6433 6433     
1430 1430     
1941 1941     
3059 3059     
3932 3932     
6851 6851
  

и другой фрейм данных Subj1 имеет 304 значения в следующем формате

 0.824     
0.824     
0.824      
0.824     
0.824
  

Когда я запускаю свой код, я сталкиваюсь со следующей ошибкой

 Error in model.frame.default(formula = subj1 ~ df, drop.unused.levels = TRUE) : 
  invalid type (list) for variable 'subj1'
  

есть предложения, почему значения data.frame из переменной subj1 недопустимы

Комментарии:

1. Похоже на вопрос StackOverflow. Вы пробовали str(subj1) ? Это может дать некоторое представление

2. @Джон, Да, я пробовал это, оно вернуло следующие значения: str (subj1) : ‘data.frame’: 304 об. из 1 переменной: $ rep (0,824, каждая = 304): num 0.824 0.824 0.824 0.824 0.824 0.824 0.824 0.824 0.824 0.824 ..

3. Я думаю, R ожидает вектор, а не data.frame. Вы пробовали использовать subj1 <- rep(0.824,each=304) , не превращая ее в df?

4. @JarkoDubbeldam, Да, я пробовал это, но проблема в другом фрейме данных «df», как я мог бы преобразовать data.frame «df» в массив?

5. Если вы обратитесь к документации для model.matrix , посмотрите, можете ли вы повторить первый пример (они используют набор данных деревьев) для ваших данных. Если вы не можете вычислить model.frame или model.matrix, то @JarkoDubbeldam может быть правильным. На самом деле вам может потребоваться объединить два фрейма данных вместе, чтобы вы ссылались только на один фрейм данных.

Ответ №1:

Как уже упоминалось, вы пытаетесь указать data.frame в качестве независимой переменной. Попробуйте:

  fit <- lm(subj1 ~ ., data=df )
  

При этом будут использоваться все переменные во фрейме данных, при условии, что subj1 это имя зависимой переменной, а не фрейм данных сам по себе.

Если в df есть два столбца, которые являются предикторами, а subj1 — предсказанная (зависимая) переменная, объедините эти два столбца, дайте им правильные имена столбцов и создайте модель в приведенном выше формате.

Что-то вроде:

 data <- cbind(df, subj1)
names(data) <- c("var1", "var2", "subj1")
fit <- lm(subj1 ~ var1   var2, data=df )
  

Редактировать: некоторые указатели:

  1. убедитесь, что вы используете единый фрейм данных, который содержит все ваши независимые переменные и вашу зависимую переменную.
  2. Количество строк должно быть равным.
  3. Если независимая переменная является константой, она не имеет дисперсии для разных значений зависимой переменной, и поэтому не будет иметь значения. Если зависимая переменная является константой, нет смысла регрессировать — мы можем предсказать значение со 100% точностью.

Комментарии:

1. Я хотел бы получить наклон кривой регрессии, но результат регрессии не дает мне перехвата: ниже приведен результат: Signif. коды: 0 ‘ ’ 0.001 ‘ ’ 0.01‘ ’ 0.05 ‘.’ 0.1 ‘ ’ 1 Остаточная стандартная ошибка: 1,948e-29 для 2 степеней свободы, кратных R-квадрату: 0, скорректированный R-квадрат: -150,5 F-статистика: 0 для 301 и 2 DF, p-значение: 1 Предупреждающее сообщение: В summary.lm (подгонка): практически идеальная подгонка: сводка может быть ненадежной >

2. Это потому, что в коде, который вы опубликовали в op, переменная ответа subj1 является константой, поэтому перехват сам по себе является идеальным предиктором. Вам не нужен наклон для прогнозирования subj1 , потому что вы знаете это, просто глядя на него.

3. следующая ошибка, которую я получаю: Ошибка в именах (данных) <- c («var1», «var2», «subj1»): атрибут ‘names’ [3] должен иметь ту же длину, что и вектор [2]

4. вы должны связать subj1 с фреймом данных. И @JarkoDubbeldam прав, она не должна быть постоянной, иначе нет отклонения.