سؤال

لقد قرأت الإجابات على هذا سؤال وهي مفيدة للغاية ، لكنني بحاجة إلى مساعدة خاصة في R.

لدي مثال على مجموعة بيانات في R كما يلي:

x <- c(32,64,96,118,126,144,152.5,158)  
y <- c(99.5,104.8,108.5,100,86,64,35.3,15)

أريد أن ألائم نموذجًا لهذه البيانات بحيث y = f(x). أريد أن يكون نموذجًا متعدد الحدود من الترتيب الثالث.

كيف يمكنني فعل ذلك في ص؟

بالإضافة إلى ذلك ، هل يمكن R مساعدتي في العثور على أفضل نموذج مناسب؟

هل كانت مفيدة؟

المحلول

للحصول على عدد متعدد الحدود من الدرجة الثالثة في x (x^3) ، يمكنك القيام به

lm(y ~ x + I(x^2) + I(x^3))

أو

lm(y ~ poly(x, 3, raw=TRUE))

هل يمكن أن تتناسب مع عدد الحدود العاشرة والحصول على ملاءمة شبه مثالية ، ولكن هل يجب عليك؟

تحرير: Poly (x ، 3) ربما يكون خيارًا أفضل (انظر @hadley أدناه).

نصائح أخرى

أي نموذج يعتمد "أفضل نموذج مناسب" على ما تعنيه بـ "الأفضل". R لديه أدوات للمساعدة ، ولكن تحتاج إلى توفير تعريف "الأفضل" للاختيار بينها. النظر في المثال التالي بيانات ورمز:

x <- 1:10
y <- x + c(-0.5,0.5)

plot(x,y, xlim=c(0,11), ylim=c(-1,12))

fit1 <- lm( y~offset(x) -1 )
fit2 <- lm( y~x )
fit3 <- lm( y~poly(x,3) )
fit4 <- lm( y~poly(x,9) )
library(splines)
fit5 <- lm( y~ns(x, 3) )
fit6 <- lm( y~ns(x, 9) )

fit7 <- lm( y ~ x + cos(x*pi) )

xx <- seq(0,11, length.out=250)
lines(xx, predict(fit1, data.frame(x=xx)), col='blue')
lines(xx, predict(fit2, data.frame(x=xx)), col='green')
lines(xx, predict(fit3, data.frame(x=xx)), col='red')
lines(xx, predict(fit4, data.frame(x=xx)), col='purple')
lines(xx, predict(fit5, data.frame(x=xx)), col='orange')
lines(xx, predict(fit6, data.frame(x=xx)), col='grey')
lines(xx, predict(fit7, data.frame(x=xx)), col='black')

أي من هذه النماذج هي الأفضل؟ يمكن تقديم الحجج لأي منها (لكنني لا أريد استخدام الحجج الأرجواني للاستيفاء).

فيما يتعلق بالسؤال "هل يمكن أن يساعدني في العثور على أفضل نموذج مناسب" ، فمن المحتمل أن تكون هناك وظيفة للقيام بذلك ، على افتراض أنه يمكنك تحديد مجموعة النماذج للاختبار ، ولكن هذا سيكون نهجًا أوليًا جيدًا لمجموعة N-1 الحدود الحدود:

polyfit <- function(i) x <- AIC(lm(y~poly(x,i)))
as.integer(optimize(polyfit,interval = c(1,length(x)-1))$minimum)

ملاحظات

  • تعتمد صحة هذا النهج على أهدافك ، وافتراضات optimize() و AIC() وإذا كان AIC هو المعيار الذي تريد استخدامه ،

  • polyfit() قد لا يكون لديه حد أدنى واحد. تحقق من هذا بشيء مثل:

    for (i in 2:length(x)-1) print(polyfit(i))
    
  • لقد استخدمت as.integer() الوظيفة لأنه ليس من الواضح لي كيف يمكنني تفسير متعدد الحدود.

  • لاختبار مجموعة تعسفية من المعادلات الرياضية ، ضع في اعتبارك 'eureqa' برنامج استعرضه أندرو جلمان هنا

تحديث

انظر أيضا stepAIC وظيفة (في الحزمة الشاملة) لأتمتة اختيار النموذج.

أسهل طريقة للعثور على أفضل ملاءمة في R هي ترميز النموذج على النحو التالي:

lm.1 <- lm(y ~ x + I(x^2) + I(x^3) + I(x^4) + ...)

بعد استخدام انحدار AIC

lm.s <- step(lm.1)
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top