Вопрос по r, linear-regression, weighted – «Взвешенная» регрессия в R
Я создал скрипт, подобный приведенному ниже, для выполнения чего-то, что я назвал & quot; взвешенным & quot; регрессии:
<code>library(plyr) set.seed(100) temp.df <- data.frame(uid=1:200, bp=sample(x=c(100:200),size=200,replace=TRUE), age=sample(x=c(30:65),size=200,replace=TRUE), weight=sample(c(1:10),size=200,replace=TRUE), stringsAsFactors=FALSE) temp.df.expand <- ddply(temp.df, c("uid"), function(df) { data.frame(bp=rep(df[,"bp"],df[,"weight"]), age=rep(df[,"age"],df[,"weight"]), stringsAsFactors=FALSE)}) temp.df.lm <- lm(bp~age,data=temp.df,weights=weight) temp.df.expand.lm <- lm(bp~age,data=temp.df.expand) </code>
Вы можете увидеть это вtemp.df
каждая строка имеет свой вес, что я имею в виду, что в общей сложности 1178 выборок, но для строк с одинаковымиbp
а такжеage
, они объединяются в 1 строку и представлены вweight
колонка.
Я использовалweight
параметры вlm
функции, а затем я проверяю результат с другим фреймом данных, чтоtemp.df
фрейм данных "расширен". Но я нашелlm
выходные данные разные для 2-го кадра данных.
Я неправильно истолковалweight
параметры вlm
может ли кто-нибудь дать мне знать, как правильно запустить регрессию (то есть, не расширяя фрейм данных вручную) для набора данных, представленного какtemp.df
? Благодарю.
summary
выходной, они разные
lokheart
temp.df
представить 1178 строк данных, используя 200 строк. Они должны представлять одно и то же значение p, если одна и та же регрессия выполняется в 2 кадрах данных. Мне нужно исправить это, потому что в моем случае у меня может быть более 1 миллиона строк, если я не используюweight
метод, мне может не хватить памяти, чтобы хранить их все.
lokheart
что степени свободы не суммируются должным образом, чтобы получить правильную статистику Df и среднего квадрата. Это исправит проблему:
temp.df.lm.aov <- anova(temp.df.lm)
temp.df.lm.aov$Df[length(temp.df.lm.aov$Df)] <-
sum(temp.df.lm$weights)-
sum(temp.df.lm.aov$Df[-length(temp.df.lm.aov$Df)] ) -1
temp.df.lm.aov$`Mean Sq` <- temp.df.lm.aov$`Sum Sq`/temp.df.lm.aov$Df
temp.df.lm.aov$`F value`[1] <- temp.df.lm.aov$`Mean Sq`[1]/
temp.df.lm.aov$`Mean Sq`[2]
temp.df.lm.aov$`Pr(>F)`[1] <- pf(temp.df.lm.aov$`F value`[1], 1,
temp.df.lm.aov$Df, lower.tail=FALSE)[2]
temp.df.lm.aov
Analysis of Variance Table
Response: bp
Df Sum Sq Mean Sq F value Pr(>F)
age 1 8741 8740.5 10.628 0.001146 **
Residuals 1176 967146 822.4
Сравнить с:
> anova(temp.df.expand.lm)
Analysis of Variance Table
Response: bp
Df Sum Sq Mean Sq F value Pr(>F)
age 1 8741 8740.5 10.628 0.001146 **
Residuals 1176 967146 822.4
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Я немного удивлен, что это не часто встречается на R-help. Либо это, либо мои способности к разработке стратегии поиска ослабевают с возрастом.