#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 )
Редактировать: некоторые указатели:
- убедитесь, что вы используете единый фрейм данных, который содержит все ваши независимые переменные и вашу зависимую переменную.
- Количество строк должно быть равным.
- Если независимая переменная является константой, она не имеет дисперсии для разных значений зависимой переменной, и поэтому не будет иметь значения. Если зависимая переменная является константой, нет смысла регрессировать — мы можем предсказать значение со 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 прав, она не должна быть постоянной, иначе нет отклонения.